c++ - 断言:指针必须来自 'local' 堆

标签 c++ memory-management dll assertion

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

这是否与我的运行时库设置有关:它是“Multithreaded-Debug-DLL (/MDd)”? 在 cmakelist.txt 的 clunk 中,我添加了以下代码行:

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

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

最佳答案

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

您必须确保将内存返回给分配它的同一个分配器。这里有一些模式可以避免这个问题:

  1. 让应用程序来代替库为返回的结构分配内存。然后应用程序可以释放结构。

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

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

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

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

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

关于c++ - 断言:指针必须来自 'local' 堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14893649/

相关文章:

mobile - 在 CLR/Mono 上经常调用的函数中进行分配是否效率低下?

python - 如何测量 python 中对象的内存使用情况?

c# - 使用 wpf 将 dll 合并为单个 .exe

c++ - 从 vb 调用非托管 c++ dll 中的函数

c++ - 如何创建采用基类和派生类的函数的专用版本和默认版本?

c++ - 有没有办法通过函数指针调用运算符函数?

c++ - 赋值运算符复制数组中除可用空间以外的所有内容

c++ - 修改 "__cxa_allocate_exception"没有使用malloc

c++ - 从工厂返回静态或动态分配的对象?

Powershell 调用程序集委托(delegate)