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 对象的指针,并且不会在此过程中破坏它。