内存管理、堆损坏和 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++ 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • 创建线程之前的 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