释放std :: vector C ++的内存

时间:2011-09-29 10:12:41

标签: c++ mfc stdvector

我有一个矢量如下。

std::vector<std::string> exportNameList;

我通过使用push_back方法向此添加元素。但我得到一个调试断言为“

  

“Windows已在AxCent.exe中触发了断点。这可能是由于堆损坏,这表示AxCent.exe或其加载的任何DLL中存在错误。

当它调用类的析构函数时会发生这种情况。当我引用调用堆栈时,我被引导到vector类中的以下代码块。

~vector()
{   // destroy the object
    _Tidy();
}

我注意到删除矢量时出错。我对么?我该如何解决?我已经提到了很多例子,但是还没有设法解决这个问题。我是C ++的新手。

非常感谢。

2 个答案:

答案 0 :(得分:5)

你可能会破坏其他地方使用的内存。

答案 1 :(得分:1)

您遇到的错误可能与您的矢量没有直接关系。 如果在调用向量的析构函数之前内存(堆)已损坏,则堆管理器此时可能只检测到损坏(释放由向量动态分配的结构或内部动态分配的字符串)。

在我看来,在Windows平台上处理这类错误的最佳方法是激活程序的整页堆。

您可以通过两种方式执行此操作:

  • 使用'Debugging Tools for Windows'中包含的gflags。以管理员身份运行,转到“图像文件”选项卡,在“图像”字段(AxCent.exe)中输入EXE的名称,按Tab键并选中“启用页面堆”并按“应用”
  • 或使用Application Verifier。通过File / App应用程序菜单选择您的可执行文件,选中“Basics / Heap”选项,然后单击“保存”。

启动此应用程序时将应用此设置。

然后在调试器(WindDbg或Visual Studio)下运行您的应用程序。如果在删除向量之前内存已损坏,则此时调试器应该会中断。

完成跟踪错误后,请不要忘记关闭整页堆。