Я тестирую небольшую звуковую библиотеку под названием 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")
Я все еще получаю сообщение, что есть проблемы с распределением указателя. Почему так?
Вы, вероятно, выделяете память с одной стороны границы приложения / библиотеки, а освобождаете ее с другой. Это трудно понять правильно и, вероятно, лучше избегать.
Вы должны убедиться, что память возвращается тому же распределителю, который ее выделил. Вот несколько шаблонов, чтобы избежать этой проблемы:
Вместо библиотеки, выделяющей память для возвращаемой структуры, пусть приложение сделает это. Тогда приложение может освободить структуру.
Пусть библиотека выделяет память для структуры, но вместо того, чтобы приложение освобождает ее, пусть приложение вызывает специальную свободную функцию. Поэтому, если в библиотеке есть функция ‘getFoo’, которая возвращает выделенную структуру, есть функция ‘freeFoo’, которая освобождает эту структуру. Это гарантирует, что библиотека возвращает структуру своему собственному распределителю.
Попросите библиотеку использовать статически размещенные структуры, которые действительны до какого-то конкретного следующего вызова библиотеки.
Дайте библиотеке функцию ‘setAlloctor’ и передайте ей указатель на malloc
а также free
из приложения. Таким образом, библиотека всегда будет использовать распределитель приложения.
Дайте библиотеке getAllocator
функция, которая возвращает указатели на malloc
а также free
функции, которые использует библиотека. Таким образом, приложение может получить память от распределителя библиотеки (чтобы библиотека могла быть освобождена) или вернуть память распределителю библиотеки (который выделена библиотекой).
Посмотрите на код, который генерирует утверждение, и посмотрите, можно ли его изменить, чтобы использовать один из этих шаблонов. Возможно, например, что вы просто звоните delete
на указатель на объект, который вы получили из библиотеки, когда вам следует использовать специальную функцию-деструктор, предоставляемую библиотекой.
Других решений пока нет …