System.AccessViolationException: '试图读取或写入受保护的内存。 (为 C++ 库制作一个包装器)
System.AccessViolationException: 'Attempted to read or write protected memory. (Making a wrapper for a c++ lib)
我的构造函数如下
ScaperEngine::ScaperEngine(GrabberType grabberType, bool timing) {
switch (grabberType)
{
case GrabberType::DepthSenseGrabber:
this->interface = new pcl::DepthSenseGrabber("");
break;
default:
throw new std::exception("Grabber type wasn't chosen correctly");
break;
}
executionPipeline = new ExecutionPipeline();
executionPipeline->setTiming(timing);
}
然后我有一些代码:
void ScaperEngine::StartPipeline()
{
IPCLNormalCalculator* normalCalculator = new PCLNormalCalculator(normalCalcMaxDepthChangeFactor, normalSmoothingSize);
executionPipeline->SetPCLNormalCalculator(normalCalculator);
最奇怪的是,构造函数以正确的方式构建 executionPipeline,将其放置在内存中的 0x0000020ef385e830 中,但是当我的 c# 托管代码调用 StartPipeline 时,executionPipeline 地址更改为 0xcdcdcdcdcdcdcdcd,并且在 Quick Watch 中出现以下文本对于它的变量 <Unable to read memory>
.
请问有人知道这是怎么回事吗?
非常感谢。
您看到的 0xcdcdcdcdcdcdcdcd
是 Visual Studio 调试器的一个特殊功能,表示未初始化的堆内存。 this Whosebug question 提供了更全面的代码列表。简而言之,您的 C# 代码似乎正在对无效对象调用 StartPipeline()
。例如,如果指针被更改为指向堆内存中的随机位置,则可能会发生这种情况。使您的 C# 代码(和运行时)正确存储指向 ScraperEngine
对象的指针,并且不会在此过程中破坏它。
我的构造函数如下
ScaperEngine::ScaperEngine(GrabberType grabberType, bool timing) {
switch (grabberType)
{
case GrabberType::DepthSenseGrabber:
this->interface = new pcl::DepthSenseGrabber("");
break;
default:
throw new std::exception("Grabber type wasn't chosen correctly");
break;
}
executionPipeline = new ExecutionPipeline();
executionPipeline->setTiming(timing);
}
然后我有一些代码:
void ScaperEngine::StartPipeline()
{
IPCLNormalCalculator* normalCalculator = new PCLNormalCalculator(normalCalcMaxDepthChangeFactor, normalSmoothingSize);
executionPipeline->SetPCLNormalCalculator(normalCalculator);
最奇怪的是,构造函数以正确的方式构建 executionPipeline,将其放置在内存中的 0x0000020ef385e830 中,但是当我的 c# 托管代码调用 StartPipeline 时,executionPipeline 地址更改为 0xcdcdcdcdcdcdcdcd,并且在 Quick Watch 中出现以下文本对于它的变量 <Unable to read memory>
.
请问有人知道这是怎么回事吗?
非常感谢。
您看到的 0xcdcdcdcdcdcdcdcd
是 Visual Studio 调试器的一个特殊功能,表示未初始化的堆内存。 this Whosebug question 提供了更全面的代码列表。简而言之,您的 C# 代码似乎正在对无效对象调用 StartPipeline()
。例如,如果指针被更改为指向堆内存中的随机位置,则可能会发生这种情况。使您的 C# 代码(和运行时)正确存储指向 ScraperEngine
对象的指针,并且不会在此过程中破坏它。