所以,我需要一些帮助。我正在开发一个 C++ 项目。然而,我认为我已经设法破坏了我的堆。这是基于我添加了一个事实std::string
给一个类并为其分配另一个类的值std::string
:
std::string hello = "Hello, world.\n";
/* exampleString = "Hello, world.\n" would work fine. */
exampleString = hello;
我的系统因堆栈转储而崩溃。所以基本上我需要stop并检查我所有的代码和内存管理内容,找出我搞砸的地方。代码库仍然很小(大约 1000 行),因此这很容易做到。
尽管如此,我还是对这类东西感到不知所措,所以我想我应该把它扔掉。我在 Linux 系统上,并且已经研究过了valgrind
,虽然不完全知道我在做什么,但它确实报告说std::string
的析构函数是无效的 free。我不得不承认“堆损坏”这个词是从 Google 搜索中得到的。任何有关此类内容的通用文章也将不胜感激。
(在之前rm -rf ProjectDir
,在 C# 中再做一次:D)
编辑:
我还没有说清楚,但我要求的是诊断此类记忆问题的方法建议。我知道 std::string 的东西是正确的,所以这是我所做的事情(或者是一个错误,但选择没有问题)。我确信我可以检查我编写的代码,你们这些非常聪明的人很快就会发现问题,但我想将这种代码分析添加到我的“工具箱”中。
这些是可能解决问题的相对便宜的机制:
- 关注我的堆损坏问题 https://stackoverflow.com/questions/1069/heap-corruption-under-win32-how-to-locate- 我正在更新答案。第一个是平衡
new[]
and delete[]
,但你已经这样做了。
- Give valgrind http://valgrind.org/更多的是一次尝试;它是一个出色的工具,我只希望它可以在 Windows 下使用。我只将你的程序速度减慢了大约一半,这与 Windows 的同等程序相比已经相当不错了。
- 考虑使用谷歌性能工具 http://code.google.com/p/google-perftools/作为 malloc/new 的替代品。
- 您是否已清除所有目标文件并重新开始?也许你的 make 文件是......“次优”
- 你不
assert()
在你的代码中已经足够了。没有亲眼所见我怎么知道呢?就像使用牙线一样,没有人assert()
他们的代码就足够了。为您的对象添加验证函数,并在方法开始和方法结束时调用该函数。
- Are you 编译墙 http://gcc.gnu.org/onlinedocs/gcc-4.3.0/cpp/Invocation.html#Invocation?如果没有,就这样做。
- 为自己找到一个 lint 工具,例如PC-Lint http://www.gimpel.com/。像您这样的小应用程序可能适合页面,意味着您没有购买!
- 检查删除指针后是否将其置空。没有人喜欢悬空指针。具有已声明但未分配的指针的相同演出。
- 停止使用数组。用一个vector http://en.wikipedia.org/wiki/Vector_(STL)反而。
- 不要使用原始指针。用一个智能指针 http://en.wikipedia.org/wiki/Smart_pointer。不要使用
auto_ptr
!那件事……令人惊讶;它的语义非常奇怪。相反,选择其中之一增强智能指针 http://www.boost.org/doc/libs/1_35_0/libs/smart_ptr/smart_ptr.htm,或者一些东西洛基图书馆 http://en.wikipedia.org/wiki/Loki_(C%2B%2B).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)