Ошибка виртуальной таблицы C ++? - PullRequest
3 голосов
/ 26 ноября 2010

У меня следующая структура:

//Unmanaged(.h)
class myInterface
{
public:
   virtual bool Send(char* myChar);
}

//Managed (.h)
class myClass;

public ref class Parser
{
   bool Transmit(String^ mString);
}

class myClass : public myInterface
{
public:
   virtual bool Send(char* myChar);
private:
   gcroot<Parser^> pParser;
}

Моя проблема в том, что где-то в моем неуправляемом коде я должен вызвать функцию Send.Он вызывает функцию из управляемого кода Send, но функция Send вызывает метод Transmit из класса Parser.Проблема в том, что когда я отлаживаю, экземпляр pParser пуст (даже если я уже создал его ранее в конструкторе).

Это ошибка сборщика мусора или виртуальная таблица вводит в заблуждение?Как я могу это исправить?Спасибо!

ОБНОВЛЕНИЕ: После некоторой дальнейшей отладки я понял, что если я включу другие экземпляры gcroot, например:

gcroot<AppDomaion^> pDomain;

и затем в коде попытался запустить:

pDomain = AppDomain::CurrentDomain;

Отладчик покажет то же пустое значение, что и для pParser.Что-то не так с тем, что я делаю?я должен создать экземпляр класса по-другому?

UPDATE2:

Managed / Unmanaged выглядит примерно так:

Wrapper: (wrapper.h)

public ref class Wrapper
{
public:
   Send(String^ mSendMessage);
   Parse(String^ mMessageString);
...
private:
   ComLayer* mComm;
   CInferface mInterface;
};

private class CInterface : public IIterface
{
public:
   virtual bool Deliver(CMessage mMessage);
...
private:
   gcroot<Wrapper^> mParent;
};

Оболочка (wrapper.cpp)

Wrapper::Send(String^ mSendMessage)
{
...
mComm->Send(mMessage);
}
Wrapper::Parse(String^ mMessageString)
{
...
}

CInterface::Deliver(CMessage* mMessage)
{
...
//Here, mParent value is empty under Labview, not while Debug/VS/WindowsForm
mParent->Parse(mMessageString)
}

Неуправляемый: (commLayer.h)

class CommLayer
{
public:
//Send:
   bool Send(CMessage* mMessage);
...
private:
//instead of CInterface, IInterface.
   IInterface mInterface;
};

Неуправляемый: (IInterface.h)

class IInterface
{
public:
//Response:
   virtual bool Deliver(CMessage mMessage);
};

Проблема в том, что когда неуправляемый код вызывает mInferface-> Deliver (mMessage);Там нет экземпляра для mParent.Затем в оболочке mParent пуст (значение = ноль);Похоже на то, что он получит доступ только к методам из неуправляемого интерфейса II, а не к обертке ^ из оболочки CInterface.

1 Ответ

0 голосов
/ 26 ноября 2010

Я считаю, что при подключении к процессу вам нужно включить как собственную, так и управляемую отладку.

Это можно сделать в диалоговом окне «Присоединить к процессу», нажав кнопку «Выбрать» рядом с полем «Присоединить к:».

Хотя обычно для этого параметра установлено значение «Автоматически», которое должно определять, выполняется ли процесс с CLR, и выбирать правильные записи для этого диалогового окна.

...