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

时间:2013-02-15 11:25:43

标签: c++ memory-management dll assertion

我正在测试一个名为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")

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

1 个答案:

答案 0 :(得分:7)

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

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

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

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

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

  4. 为库提供一个'setAlloctor'函数,并从应用程序向它传递指向mallocfree的指针。这样,库将始终使用应用程序的分配器。

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

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