【发布时间】:2014-03-15 03:32:38
【问题描述】:
我最近遇到了内存泄漏问题。我对该问题进行了很长时间的故障排除,随后发现抛出异常(我使用自己的异常类)会导致此内存泄漏。抛出异常的代码如下:
HINSTANCE lib = LoadLibrary(path.c_str());
if(!lib)
{
DWORD werror = GetLastError();
ostringstream stream;
stream << werror;
string errstring = "Error " + stream.str();
errstring.append(" - " + libraryName);
throw LibraryLoadException(MOD_ERROR_LIB_LOAD, errstring.c_str());
}
生成的输出如下所示:
Detected memory leaks!
Dumping objects ->
{351} normal block at 0x0044D208, 32 bytes long.
Data: <Error 126 - note> 45 72 72 6F 72 20 31 32 36 20 2D 20 6E 6F 74 65
{347} normal block at 0x0043BD98, 8 bytes long.
Data: <4 > > 34 F2 3E 00 00 00 00 00
{344} normal block at 0x0043FDE8, 32 bytes long.
Data: <126 > 31 32 36 CD CD CD CD CD CD CD CD CD CD CD CD CD
{302} normal block at 0x004409D8, 8 bytes long.
Data: <4 > > 34 F3 3E 00 00 00 00 00
{301} normal block at 0x0043FAF0, 8 bytes long.
Data: <P > > 50 F3 3E 00 00 00 00 00
Object dump complete.
从 Visual Studio Leak CrtDbg 的输出中可以看出,if 块中使用的对象的实际值。但是,包括异常本身(及其所有属性)在内的所有这些对象都是在堆栈上分配的,所以我不会忘记在堆上释放某些东西。 我对此进行了经验测试,泄漏肯定是由 if 块中的对象引起的(在删除了字符串、DWORD 和流等多个对象后,泄漏变得更少)。
谁能告诉我这里我在做什么(或什么)错了?
提前谢谢你
【问题讨论】:
-
请发布一个完整的示例,以及捕获异常的
catch子句。 -
“libraryName”从何而来?正如您发布的那样,这段代码真的是独立的,还是类或结构的成员函数的一部分?如果是后者,那么内存泄漏可能是由于您分配的包含此函数的对象未销毁而导致的。
标签: c++ exception memory-leaks throw