断言:指针必须来自'本地'堆

iSt*_*ffi 0 c++ dll memory-management assertion

我正在测试一个名为clunk的小型声音库(http://sourceforge.net/projects/clunk/).我为visual studio 11构建了该库,并将其链接到我的visual studio项目中.当我尝试test.cpp时,我收到了msvcr110d.dll抛出的断言.

是否与我的运行时库设置有关:它是" 多线程调试DLL(/ MDd) "?在clunk的cmakelist.txt中,我添加了以下代码行:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
Run Code Online (Sandbox Code Playgroud)

我仍然收到指针分配问题的消息.为什么?

Dav*_*rtz 7

您可能在应用程序/库边界的一侧分配内存,而在另一侧释放内存.这很难做到正确,最好避免.

您必须确保将内存返回到分配它的同一分配器.以下是一些避免此问题的模式:

  1. 而不是库为返回的结构分配内存,让应用程序执行它.然后应用程序可以释放结构.

  2. 让库为结构分配内存,但是应用程序调用一个特殊的自由函数而不是释放它的应用程序.因此,如果库中有一个返回已分配结构的'getFoo'函数,则使用'freeFoo'函数来释放该结构.这可以确保库将结构返回给自己的分配器.

  3. 让库使用静态分配的结构,这些结构在下一次调用库之前有效.

  4. 给库中的"setAlloctor"功能和指针传递它malloc,并free从应用程序.这样,库将始终使用应用程序的分配器.

  5. 为库提供一个getAllocator函数,该函数返回指向库正在使用的函数mallocfree函数的指针.这样,应用程序可以从库的分配器获取内存(对于库可能空闲)或将内存返回到库的分配器(库分配).

查看生成断言的代码,看看是否可以修改它以使用其中一种模式.例如,delete当您应该使用库提供的特殊析构函数时,您可能只是调用指向从库中获取的对象的指针.