2011-09-29 91 views
2

我有一个向量,如下所示。释放std :: vector的内存C++

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

我正在使用push_back方法为此添加元素。但是,我得到一个调试断言为“

” Windows已经引发了AxCent.exe.This断点可能是由于堆的腐败,这表明在AxCent.exe或任何的DLL中的错误它已经加载。

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

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

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

非常感谢。

+0

你能展示你的矢量的真实声明吗?你在里面存储什么类型的对象? – Nikko

+0

嗨。你的问题究竟是什么?当'exportNameList'超出范围时,向量内存将被释放。对于它所依赖的元素。 – esskar

+0

,并显示您的代码为具有此成员的类的析构函数。 – Mat

回答

5

你大概会损坏矢量在别处使用的内存。

+0

你能否给我任何线索?我只在调试模式下收到此错误。谢谢。 – gishara

+0

你应该重新检查你的应用程序的相关部分(开始的一个好点将是访问所述矢量或其元素的所有地方)。如果可能,请尝试减小程序的大小,直到找到错误。恐怕我们无法帮助你。 –

+0

@gishu如果你不知道如何在你的程序的其他地方损坏矢量,想象一下:你有一个指向错误位置的指针(偶然地,这恰好是矢量)。你写信给它,矢量变坏了。更可能的情况是这样的:在矢量旁边的堆栈中有一个数组。您将数组的索引写入数组的边界之外,然后检查矢量数据并将其破坏。 – Shahbaz

1

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

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

您可以通过两种方式做到这一点:

  • 或者使用包含在“Windows调试工具” GFLAGS。运行它作为管理员,转到'图像文件'选项卡,在图像字段(AxCent.exe)中输入您的EXE的名称,按TAB并选中'启用页堆',然后按'应用'
  • 或使用应用程序验证。通过文件/应用程序应用程序菜单选择您的可执行文件进行勾选'基本/堆'选中并点击保存。

无论何时启动此应用程序,都会应用此设置。

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

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

+0

非常感谢Thierry。我不会尝试使用'Windows调试工具',但发现它非常复杂。无论如何,我会再试一次。再次感谢。 – gishara

+0

“Windows调试工具”(WinDbg,kd,cdb)中包含的调试器首先可能会吓到你。我可以理解,但知道这些工具是非常有价值的。包含在同一个软件包中的gflags只是配置注册表的一个小界面,以便Windows将一些策略应用于您的应用程序。它非常易于使用,对于您遇到的特定问题,Visual Studio应该足以查明您的问题。 –