оператор "new" возвращает нелокальный указатель кучи только для одного класса? - PullRequest
1 голос
/ 12 мая 2010

Язык: C ++

Платформа: Windows Server 2003

У меня есть exe, вызывающий DLL.

РЕДАКТИРОВАТЬ: (exe ничего не делает, он вызывает несколько глобальных функций, которые делают все, что связано с DLL внутри DLL. Он явно не new ни один из классов DLL)

Я выделяю ( new ) память для класса A внутри DLL, он возвращает мне нелокальный указатель кучи .

Я пытался новых других классов в DLL (которые находятся в DLL), «new» возвращает действительный указатель кучи для них, его единственный Class A , который не используется распределяется правильно.

Я нахожусь на окнах и проверяю кучу этим вызовом функции:

EDIT:

 ClassA* pA = new ClassA(); 

 _CrtIsValidHeapPointer ( (const void *) pA )

Я серьезно смущен, почему это происходит только с new -ing Class A и без другого класса?

(полностью собственный код)

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:
это оказалось плохим телосложением. не могу воспроизвести его в новом ... потратил 5 дней на это: '(

Ответы [ 3 ]

2 голосов
/ 12 мая 2010

Экспорт только глобальных функций из DLL и вызов только экспортируемых функций и через v-таблицы. Ваша проблема только одна из многих, вызванных попыткой экспортировать целые классы. Библиотеки не такие как библиотеки .so.

РЕДАКТИРОВАТЬ: так как вопрос теперь показывает, что класс не экспортируется, но все это наблюдается внутри одной DLL, предлагая другие возможные причины.

Является ли тот же указатель, возвращаемый из new, который тестируется, или это может быть указатель на базовый подобъект? Распределение использовало new или new []? Любой из них может привести к тому, что указатель будет указывать на середину блока кучи вместо начала.

1 голос
/ 12 мая 2010

Если Class A переопределяет operator new, тогда память для этого класса может быть выделена в копии DLL среды выполнения C. Это приведет к тому, что _CrtIsValidHeapPointer вернет false - потому что ваша версия библиотеки времени выполнения C использует кучу, отличную от той, что в DLL.

Значение, возвращаемое из _CrtIsValidHeapPointer, как правило, в любом случае ненадежно (конечно, даже если оно может возвращать TRUE, это не обязательно означает, что вы можете использовать указатель). Почему ты так делаешь?

1 голос
/ 12 мая 2010

Возможно, класс объявляет своего нового оператора new, который получает хранилище из какого-то загадочного места?

например. Автор класса мог написать:

class MyClass {
   public:
     void * operator new (size_t amt);
     void operator delete(void *);
};

Тогда их оператор новый бьет вашего оператора новый.

Либо это, либо DLL создается с / MTd, а исполняемый файл использует /MD.

.
...