std::string 构造函数中的内存分配/堆损坏

2023-11-29

我在内存分配方面再次遇到了一些麻烦,但我不明白为什么。

当我在调试模式下运行程序时,我收到以下错误消息(我尝试尽可能准确地翻译它):

Windows 已触发 LogoColorDetector.exe 中的断点。这可能是由堆损坏引起的,这表明 LogoColorDetector.exe 或其加载的 DLL 之一存在问题[...]

当我调试程序时,我发现问题似乎出现在以下行中:

std::string tmp = imgTrain2[j]->getFilepath();

getFilepath() 函数的实现如下:

const std::string& support::Image::getFilepath() const
{
    return this->_filePath;
}

我已经检查过 imgTrain[j] 处的图像对象是否具有正确的 _filePath 字符串。所以我认为问题出在其他地方。有趣的是,包含有问题的行的函数似乎可以工作。只有第二次调用该函数时才会失败,这表明问题不在于函数本身。我不分配任何内存,也不删除函数中的任何内容,除了通过 std::string 间接完成的操作之外

如果它对任何人有帮助,这里是堆栈跟踪:

msvcr100d.dll!_heap_alloc_base(unsigned int size)  Zeile 55 C
msvcr100d.dll!_heap_alloc_dbg_impl(unsigned int nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp)  Zeile 431 + 0x9 Bytes   C++
msvcr100d.dll!_nh_malloc_dbg_impl(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp)  Zeile 239 + 0x19 Bytes   C++
msvcr100d.dll!_nh_malloc_dbg(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine)  Zeile 302 + 0x1d Bytes C++
msvcr100d.dll!malloc(unsigned int nSize)  Zeile 56 + 0x15 Bytes C++
msvcr100d.dll!operator new(unsigned int size)  Zeile 59 + 0x9 Bytes C++
LogoColorDetector.exe!std::_Allocate<char>(unsigned int _Count, char * __formal)  Zeile 36 + 0xf Bytes  C++
LogoColorDetector.exe!std::allocator<char>::allocate(unsigned int _Count)  Zeile 187 + 0xb Bytes    C++
LogoColorDetector.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Copy(unsigned int _Newsize, unsigned int _Oldlen)  Zeile 1933 + 0x12 Bytes C++
LogoColorDetector.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Grow(unsigned int _Newsize, bool _Trim)  Zeile 1963 + 0x13 Bytes   C++
LogoColorDetector.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Right, unsigned int _Roff, unsigned int _Count)  Zeile 902 + 0xe Bytes C++
LogoColorDetector.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Right)  Zeile 546 C++
LogoColorDetector.exe!compareClasses(support::ImageCollection * coll, support::ImageClass * cl1, support::ImageClass * cl2, float * mean, float * var)  Zeile 111 + 0x22 Bytes  C++

有谁知道什么可能导致这种情况?

感谢您的帮助。

- 编辑 -

使用视觉检漏仪尝试了建议。它不会显示任何内容,直到弹出上述错误消息并表示内存在释放后被修改。有没有办法找出与内存地址关联的对象 - 内存转储似乎不是很有帮助。

为了让事情变得更加神秘,我尝试添加以下行:

std::string tmp = imgTrain2[j]->getFilepath();
std::string t2Path = imgTrain2[j]->getFilepath();

现在第一行正确执行,第二行失败。


当运行时检测到堆损坏时,该堆将被already已损坏。这意味着之前的操作弄乱了它(例如:您编写了超出数组范围的内容,您损坏了指针,等等)。

使用视觉泄漏检测器或任何可以在您不应该覆盖的内存位置的确切位置发出错误信号的工具来运行您的程序(注意:这仍然可能不会在您的代码中显示错误,例如,如果您损坏了指针更早,但至少会给你一个提示what已损坏)。

Update:大卫的回答的一些附录(抱歉,所以不允许长评论)

结束这个比喻:你的程序中有一个错误。当执行包含错误的行时,可能会产生错误。它会覆盖堆中存储有关已分配内存块的信息的部分。运行时无法识别这一点,该内存段属于您的进程,因此您应该能够写入它。没有失败。现在稍后(也许在应用程序的完全不同的部分)您尝试分配新内存,new 运算符调用 heap_alloc_ 来获取新的内存块。 alloc 的代码遍历分配的内存块链并在那里发现一些垃圾。它会导致无法让您知道正在发生非常糟糕的事情。现在您必须找到代码中触发错误的错误。如果没有某种工具,您就必须检查整个代码以寻找错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::string 构造函数中的内存分配/堆损坏 的相关文章

随机推荐

  • 有没有办法让捕获在正则表达式中重复任意次数?

    我将 C tr1 regex 与 ECMA 正则表达式语法一起使用 我想做的是解析标头并返回与标头中每个项目关联的值 Header Testing some text Numbers 1 2 5 MoreStuff some more te
  • Svelte 强类型组件类

    我正在开发一个组件库 该库在组件的分组方式上有一些变化 我将组件分组为类 以便最终用户更轻松地使用该库 而不是记住哪个名字slots如果可用 他们将使用点符号访问自定义插槽 例如 一个Card组件可以有一个Header Body and a
  • 将 android studio 项目与 Firebase 集成以实现 google 登录功能时出现依赖错误

    我正在 Kotlin 中开发一个应用程序 但不断收到错误 无法解析 firebase auth 15 0 0 当尝试同步 gradle 时 我正在尝试实现谷歌登录功能 apply plugin com android application
  • PHP生成文件并提示另存为

    我有一个用于生成 csv 文件然后下载的脚本 但我需要为用户提供 另存为 对话框 因为我想要快速替换旧文件 一个简单的例子 我下载文件 myFile csv 然后编辑数据并再次下载以进行刷新 但我需要替换该文件 浏览器将其下载为 myFil
  • 如何将 Django 查询集转换为列表?

    我有以下内容 answers Answer objects filter id in answer id for answer in answer set answers all 然后后来 for i in range len answer
  • 用retrofit-gson解析JSON?

    我正在尝试使用 Retrofit 来解析 json 数据 但没有收到数据来帮助我解析数据 以下是我创建的构建器和界面 public class fetchdata private static UserFetchData userdataf
  • 在 CodeIgniter 中创建主模板

    我遇到了一个非常基本的问题 问题是我想要一个主模板 在其中我可以调用页眉 正文和页脚 我无法在标头中发送标题和 css 以及如何发送多个 css 文件 我正在做这样的事情 这是控制器中的代码 data title Login To WePO
  • 如何从左向右移动/滑动图像

    我想从左向右滑动或移动图像 例如 http rajeevkumarsingh wix com pramtechnology 读取移动的五边形框 Ok 我尝试了一下但没能做到 我使用的代码如下
  • 使用 RVM 安装后,Ruby 1.9.2 不断恢复到 1.8.7

    我安装了 Ruby 1 9 2 我用了rvm use 1 9 2然后当我输入时ruby v它说1 9 2 然后 当我退出终端并重新打开它时 它再次显示 1 8 7 我究竟做错了什么 您的默认 ruby 很可能未设置为 ruby 1 9 2
  • 如何进行货物保存分析?

    我怎样才能把货物运到save analysis 我知道我可以这样做rustc通过致电 rustc Zsave snalysis
  • Matlab,如何调整图形上的轴值(科学记数法-精度不够)[重复]

    这个问题在这里已经有答案了 可能的重复 抑制数字刻度中的指数格式 对于我的图中的每个刻度线 Matlab 将我的轴标记输出为 5 777 x10 6 是否有可能让 matlab 输出实际的十进制数字而不是科学记数法 以便刻度线实际上是不同的
  • 读取文本文件并显示在表 vbscript 中

    我有一个具有以下结构的文本文件 C Users abc Desktop New Folder sample txt AccountName gt AbcPos AccountName gt dblLayer queryAccount gt
  • 在更新插入时跳过空值

    我正在使用 pg promise 来处理我的 Postgres 查询 但在找到以下查询的解决方案时遇到了麻烦 我正在尝试创建一种方法来一次批量插入多行 这是我的代码 massUpsert orgId entities gt db tx t
  • 如何在不重新启动的情况下关闭DEP(数据执行保护)?

    我正在编写一个测试网页 它调用 DLL 文件中的函数 但是每次我使用IE或FF打开它之前我必须禁用DEP 数据执行保护 否则脚本无法执行 当前禁用 DEP 的方法需要重新启动 但我不想重新启动 基本上 我正在寻找一种无需重新启动即可关闭 D
  • Google Cardboard Unity 5 没有立体视觉

    我的 Cardboard 应用程序在设备上没有立体效果 但它在编辑器中有效 这就是它在编辑器中的样子 https i stack imgur com sN14x png 这是它在设备上的样子https i stack imgur com 7
  • Pod 在 Kubernetes 中启动但不工作

    创建了具有 3 个 Pod 的 Kubernetes 集群部署 并且全部运行良好 但是当尝试运行它们时无法做到这一点 尝试在描述部分中执行卷曲 Pod 的 Ip 内部 我可以看到此错误 MountVolume SetUp failed fo
  • 自动执行eclipse插件

    我尝试创建一个 Eclipse 插件 当 Eclipse 工作台关闭时 它会删除一些文件 我从Hello World command插件项目并添加了IWorkbenchListener就像本主题中提到的Eclipse 关闭钩子能够停止终止
  • django 对 MongoDB 的内置支持

    我正在尝试查找官方 django 是否支持任何 noSQL DBMS 尤其是 MongoDB 的信息 我找到了一个Django 1 3 的分支 the Django nonrel 官方 django 的一个分支 和其他一些不太可靠的项目 根
  • 填充xaml矩形倍数solidcolorbrush

    xaml中这种类型的填充矩形可以吗 我不想使用渐变来填充矩形 因为每个部分的图像使用不同的纯色画笔 Thanks 尝试这个
  • std::string 构造函数中的内存分配/堆损坏

    我在内存分配方面再次遇到了一些麻烦 但我不明白为什么 当我在调试模式下运行程序时 我收到以下错误消息 我尝试尽可能准确地翻译它 Windows 已触发 LogoColorDetector exe 中的断点 这可能是由堆损坏引起的 这表明 L