Утверждение: указатель ДОЛЖЕН поступать из «локальной» кучи

Я тестирую небольшую звуковую библиотеку под названием clunk (http://sourceforge.net/projects/clunk/).
Я построил эту библиотеку для visual studio 11 и соединил ее в своем проекте visual studio. Когда я пробую test.cpp, я получаю утверждение, выданное msvcr110d.dll.

Связано ли это с моими настройками библиотеки времени выполнения:Многопоточная-Debug-DLL (/ MDd)«?
В cmakelist.txt в clunk я добавил следующую строку кода:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")

Я все еще получаю сообщение, что есть проблемы с распределением указателя. Почему так?

0

Решение

Вы, вероятно, выделяете память с одной стороны границы приложения / библиотеки, а освобождаете ее с другой. Это трудно понять правильно и, вероятно, лучше избегать.

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

  1. Вместо библиотеки, выделяющей память для возвращаемой структуры, пусть приложение сделает это. Тогда приложение может освободить структуру.

  2. Пусть библиотека выделяет память для структуры, но вместо того, чтобы приложение освобождает ее, пусть приложение вызывает специальную свободную функцию. Поэтому, если в библиотеке есть функция ‘getFoo’, которая возвращает выделенную структуру, есть функция ‘freeFoo’, которая освобождает эту структуру. Это гарантирует, что библиотека возвращает структуру своему собственному распределителю.

  3. Попросите библиотеку использовать статически размещенные структуры, которые действительны до какого-то конкретного следующего вызова библиотеки.

  4. Дайте библиотеке функцию ‘setAlloctor’ и передайте ей указатель на malloc а также free из приложения. Таким образом, библиотека всегда будет использовать распределитель приложения.

  5. Дайте библиотеке getAllocator функция, которая возвращает указатели на malloc а также free функции, которые использует библиотека. Таким образом, приложение может получить память от распределителя библиотеки (чтобы библиотека могла быть освобождена) или вернуть память распределителю библиотеки (который выделена библиотекой).

Посмотрите на код, который генерирует утверждение, и посмотрите, можно ли его изменить, чтобы использовать один из этих шаблонов. Возможно, например, что вы просто звоните delete на указатель на объект, который вы получили из библиотеки, когда вам следует использовать специальную функцию-деструктор, предоставляемую библиотекой.

7

Другие решения

Других решений пока нет …