内存管理、堆损坏和 C++

2024-01-21

所以,我需要一些帮助。我正在开发一个 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 的东西是正确的,所以这是我所做的事情(或者是一个错误,但选择没有问题)。我确信我可以检查我编写的代码,你们这些非常聪明的人很快就会发现问题,但我想将这种代码分析添加到我的“工具箱”中。


这些是可能解决问题的相对便宜的机制:

  1. 关注我的堆损坏问题 https://stackoverflow.com/questions/1069/heap-corruption-under-win32-how-to-locate- 我正在更新答案。第一个是平衡new[] and delete[],但你已经这样做了。
  2. Give valgrind http://valgrind.org/更多的是一次尝试;它是一个出色的工具,我只希望它可以在 Windows 下使用。我只将你的程序速度减慢了大约一半,这与 Windows 的同等程序相比已经相当不错了。
  3. 考虑使用谷歌性能工具 http://code.google.com/p/google-perftools/作为 malloc/new 的替代品。
  4. 您是否已清除所有目标文件并重新开始?也许你的 make 文件是......“次优”
  5. 你不assert()在你的代码中已经足够了。没有亲眼所见我怎么知道呢?就像使用牙线一样,没有人assert()他们的代码就足够了。为您的对象添加验证函数,并在方法开始和方法结束时调用该函数。
  6. Are you 编译墙 http://gcc.gnu.org/onlinedocs/gcc-4.3.0/cpp/Invocation.html#Invocation?如果没有,就这样做。
  7. 为自己找到一个 lint 工具,例如PC-Lint http://www.gimpel.com/。像您这样的小应用程序可能适合页面,意味着您没有购买!
  8. 检查删除指针后是否将其置空。没有人喜欢悬空指针。具有已声明但未分配的指针的相同演出。
  9. 停止使用数组。用一个vector http://en.wikipedia.org/wiki/Vector_(STL)反而。
  10. 不要使用原始指针。用一个智能指针 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(使用前将#替换为@)

内存管理、堆损坏和 C++ 的相关文章

随机推荐

  • 创建线程之前的 Pthread 亲和性

    在创建线程之前 我需要设置亲和力 线程到核心 例如 第一个线程到第一个核心 就像是KMP AFFINITY in OpenMP 是否可以 编辑 我以这种方式尝试 但不起作用 void DoWork void args int nr int
  • 如何在 JSDoc 中描述解构对象参数

    如果我有一个将对象作为参数的 JavaScript 函数 我可以使用 JSDoc 描述该对象的预期属性 如下所示 param bar param bar baz number param bar qux number function fo
  • 没有MMU的内存保护

    我想知道如何在没有 MMU 支持的情况下保护内存 我尝试用谷歌搜索它 但没有看到任何有价值的论文或研究 那些处理它的人只处理错误 例如未初始化的指针 而不是由于软错误而导致的内存损坏 即由于硬件瞬态故障损坏了写入内存位置的指令 我想知道这一
  • 如何在 Spring hibernate 项目中忽略 json jackson 中的 "handler": {}, "hibernateLazyInitializer": {} ?

    我将 fastxml json 与对象映射器一起使用 下面是我的代码 ObjectMapper mapper new ObjectMapper mapper configure SerializationFeature FAIL ON EM
  • 获取 ORA-01033: ORACLE 初始化或关闭正在进行中

    昨天我在笔记本电脑上安装了 Oracle 12c 企业版 当我尝试通过 SQLPLUS 连接到数据库时 出现以下错误 C Users USER gt sqlplus SQL Plus Release 12 1 0 2 0 Productio
  • 错误 1329:无数据 - 提取、选择或处理零行 - 即使所有操作均正确

    在下面 即使所有操作都正确完成 我也会收到 错误 1329 无数据 提取 选择或处理零行 我的其他功能可以正常工作 几天前这个功能也可以正常工作 BEGIN DECLARE Id INT 10 DEFAULT 0 DECLARE Elm I
  • 检查 X509 证书吊销

    是否可以检查任何 X509 证书是否被吊销 实际上 我制作了一个 Java 应用程序 它只获取常规 https 链接并输出 X509 证书 我想在我的应用程序中添加一项服务来检查该证书是否已被吊销 是否有教程或简单的代码可以指导我做到这一点
  • Python Eve - 使用 objectid 的 where 子句

    我在 settings py 中定义了以下资源 builds item title builds schema sources type list schema type objectid data relation resource so
  • 使用 jersey-spring3 从 JerseyTest 容器中检索托管 bean

    这个问题是上一个问题的后续问题指定自定义应用程序上下文 https stackoverflow com questions 18278769 specify custom application context 我们正在将一些数据服务从使用
  • 启动“com.twitter.android.PostActivity”时出错

    我向 Twitter 调用了共享文本的意图 在不更改代码的情况下 一天又一天 此调用已停止工作 意图是 Intent share new Intent Intent ACTION VIEW share setClassName com tw
  • Azure 中的 REST API 日志

    是否有办法查看通过 REST API 完成的所有请求 我希望能够监视客户端 ID 完成的 REST API 调用 我想了解调用了哪些特定 API 如果可能的话 每个调用的请求 响应是什么样的 只是将其发布在这里以帮助将来的问题发布者 这是您
  • 将类切换绑定到窗口滚动事件

    当用户将浏览器窗口滚动到某个点以下时 我将切换 page div 的类 到目前为止我所做的工作正常 http jsfiddle net eTTZj 29 http jsfiddle net eTTZj 29 div div
  • 插入/删除触发器表上的慢连接

    我们有一个触发器 可以为表创建审计记录并连接inserted and deleted表以查看是否有任何列已更改 连接对于小型集合一直运行良好 但现在我要更新大约 100 万行 并且几天之内就不会完成 我尝试更新具有不同数量级的选定行数 很明
  • Android - 未找到活动异常

    我正在使用 startActivity 调用另一个 Activity 但收到 Activity Not Found Exception 这是我的代码 TextView textView TextView itemClicked String
  • 我想在服务器上 24/7 运行 Python 脚本 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在制作一个模拟虚拟货币股票市场的程序 我还没有尝试过任何东西 但我想要一个Python脚本能够24
  • 数据库时区问题

    我在尝试与数据库 MySQL 建立连接时收到此错误 java sql SQLException 服务器时区值 CEST 无法识别或代表多个时区 如果要利用时区支持 则必须配置服务器或 JDBC 驱动程序 通过 serverTimezone
  • 为什么我的 Mac (OS X 10.7.3) 有旧版本 (2.3) 的 Gnu Bison?

    我的 mac 上的 GNU Bison 版本是 2 3 但我知道 Bison 2 5 很久以前就发布了 这本书弗莱克斯和野牛使用2 5版本 我应该自己升级到2 5吗 有必要吗 2 3和2 5有什么区别 我在 MacOSX 10 9 5 上遇
  • 是否有任何架构使用相同的寄存器空间来进行标量整数和浮点运算?

    我见过的大多数支持本机标量硬件 FP 支持的架构将它们推入完全独立的寄存器空间 与主寄 存器集分开 我见过的大多数支持本机标量硬件 FP 支持的架构将它们推入完全独立的寄存器空间 与主寄 存器集分开 X86 的传统 x87 FPU 使用带有
  • 应该是 DDD 中域的本地化部分

    在遵循 DDD 概念的同时 我正在努力决定是否应该让我的域本地化意识 我提出了两个解决方案来解决这个问题 两者都使域本地化能够在不同的地方实现 我是否应该将本地化文本放入域中 分享您对此问题的解决方案或我的两个示例的优缺点 谢谢 实施例1
  • 内存管理、堆损坏和 C++

    所以 我需要一些帮助 我正在开发一个 C 项目 然而 我认为我已经设法破坏了我的堆 这是基于我添加了一个事实std string给一个类并为其分配另一个类的值std string std string hello Hello world n