Мой конструктор следующий

 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);

Самая странная вещь заключается в том, что конструктор правильно строит ExecutePipeline, помещая свое место в памяти в 0x0000020ef385e830, но когда мой управляемый код c # вызывает StartPipeline, адрес ExecutionPipeline изменяется на 0xcdcdcdcdcdcdcdcd, и в Quick Watch появляется следующий текст для его переменных <Unable to read memory>.

Пожалуйста, кто-нибудь знает, что происходит?

Большое спасибо.

0
Ahmad Mhaish 21 Ноя 2017 в 01:27

1 ответ

Лучший ответ

0xcdcdcdcdcdcdcdcd, который вы видите, - это особая функция отладчика Visual Studio, представляющая неинициализированную динамическую память. Более полный список кодов доступен в этом вопросе StackOverflow.. Вкратце, похоже, что ваш код C # вызывает StartPipeline() для недопустимого объекта. Это может произойти, например, если указатель изменен, чтобы указывать на случайное место в памяти кучи. Сделайте так, чтобы ваш код C # (и среда выполнения) правильно сохраняли указатель на объект ScraperEngine и не повреждали его по пути.

0
v1bri 20 Ноя 2017 в 23:43