Оператор «Новый» возвращающий нерукальный указчик кучи всего за один класс?

StackOverflow https://stackoverflow.com/questions/2815589

Вопрос

Язык: C ++

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

У меня есть EXE, вызывая DLL.

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

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

Я пытался новый Другие классы в DLL (которые находятся в DLL), «новое» возвращает действительную указку куча для них, его только Класс А. который не выделяется должным образом.

Я нахожусь в Windows и подтверждаю кучу этой функцией call:

РЕДАКТИРОВАТЬ:

 ClassA* pA = new ClassA(); 

 _CrtIsValidHeapPointer ( (const void *) pA )

Я серьезно запутался, почему это происходит только с новыйКласс А. И никакой другой класс?

(Весь родной код)

Последнее редактирование:
Оказалось плохое сборку. Не можете получить его, чтобы воспроизвести в новом ... впустую 5 дней на этом: '(

Это было полезно?

Решение

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

Редактировать: поскольку вопрос сейчас показывает, что класс не экспортируется, но все это наблюдается внутри одной DLL, собирается предложить другие возможные причины.

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

Другие советы

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

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

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

Например, автор класса может написать:

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

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

Либо так, либо DLL построен с / MTD, когда исполняемый используемый / мд.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top