我正在测试一个名为clunk(http://sourceforge.net/projects/clunk/)的小型声音库。 我为visual studio 11构建了该库,并将其链接到我的visual studio项目中。当我尝试test.cpp时,我收到了msvcr110d.dll抛出的断言。
是否与我的运行时库设置有关:它是“ Multithreaded-Debug-DLL(/ MDd)”? 在clunk的cmakelist.txt中,我添加了以下代码行:
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
我仍然收到指针分配问题的消息。为什么?
答案 0 :(得分:7)
您可能在应用程序/库边界的一侧分配内存,而在另一侧释放内存。这很难做到正确,最好避免。
您必须确保将内存返回到分配它的同一个分配器。以下是一些避免此问题的模式:
让应用程序执行此操作,而不是为返回的结构分配内存库。然后应用程序可以释放结构。
让库为结构分配内存,但是应用程序调用一个特殊的自由函数而不是释放它的应用程序。因此,如果库中有一个返回已分配结构的'getFoo'函数,则使用'freeFoo'函数来释放该结构。这可以确保库将结构返回给自己的分配器。
让库使用静态分配的结构,这些结构在下次调用库之前有效。
为库提供一个'setAlloctor'函数,并从应用程序向它传递指向malloc
和free
的指针。这样,库将始终使用应用程序的分配器。
为库提供一个getAllocator
函数,该函数返回指向库正在使用的malloc
和free
函数的指针。这样,应用程序可以从库的分配器获取内存(对于库可能空闲)或将内存返回到库的分配器(库分配)。
查看生成断言的代码,看看是否可以修改它以使用其中一种模式。例如,当您使用库提供的特殊析构函数时,您可能只是在指向从库中获取的对象的指针上调用delete
。