0

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

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

4

1 回答 1

7

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

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

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

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

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

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

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

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

于 2013-02-15T11:45:47.587 回答