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 构造函数中的内存分配/堆损坏 的相关文章

  • 插入多重集中:在该值第一次出现之前而不是最后一次出现之后

    正如标题所示 multiset 在所有相同值的范围末尾插入一个值 例如 在多重集中插入 21 2 2 3做到了1 2 2 new 2 3 如何在所有相同值的范围开头插入新值 例如 在多重集中插入 21 2 2 3应该使1 new 2 2 2
  • VS2015 代码覆盖率不适用于 ASP.NET Core 1.0(以前称为 ASP.NET 5)中的测试

    我有一个 ASP NET Core 1 0 以前称为 ASP NET 5 解决方案 其中包含几个类库 包 和一个 ASP NET MVC6 项目 我有一个使用支持 Core 1 0 的新 XUnit 2 0 的测试库 然而 由于某种原因 当
  • Cocoa 常量名称中的“k”代表什么[重复]

    这个问题在这里已经有答案了 可能的重复 Apple 的 API 中的 k 前缀表示什么 https stackoverflow com questions 675816 what does the k prefix indicate in
  • 委托 System.Action 不接受 1 个参数

    那个行动 readonly Action execute public RelayCommand Action execute this execute null public RelayCommand Action execute Fun
  • Motif 库的水平绘制的 RowColumn 类 (C)?

    我正在使用 Motif Library 来完成我的工作 如果有人不熟悉这个库 您可以在这里找到文件列表https packages ubuntu com xenial amd64 libmotif dev filelist https pa
  • 安装/编译 pylzma(lzma python 绑定)

    我已经向作者提出了这个问题website http www joachim bauch de projects pylzma comment page 1 comment 5211 但我想我也可以在这里问 我一直在尝试使用以下设置安装 py
  • 预期在模拟中调用一次,但使用 Moq 时调用次数为 0 次

    我收到错误 在mock上调用一次 但是0次 下面是我的代码结构 public class GenerateAddress IGenerateAddress public GenerateAddress IAddress createAdd
  • 值类型数组如何存储在 .NET 对象堆中?

    在 NET中 诸如int之类的值类型对象存储在内存中 引用类型对象需要为引用和对象单独分配内存 并且对象存储在 NET对象堆中 而Array是在堆中创建的 那么int 等值类型的数组如何存储在堆中呢 这是否意味着值类型对象可以存储在堆中而无
  • gcc 的错误?模板类中友元函数的访问控制问题

    我有一个模板类 并在类中定义了一个友元函数 include
  • “双免”是什么意思?

    正如标题所暗示的那样 我是 C 语言的新手 并且很快就会有期中考试 我目前正在修改过去的论文 一个反复出现的主题是双重自由问题 我理解就是调用的过程free 在同一个内存位置两次 但我有几个问题我不能 100 确定如何回答 问题1 C中双重
  • 使用 MemoryCache 而不是普通的旧 Dictionary 的令人信服的理由是什么

    我刚刚遇到内存缓存 http msdn microsoft com en us library system runtime caching memorycache aspx这是 NET 4 中的新增功能 我知道如果你想的话它会很有用 限制
  • 从 Windows 选择声音并播放它们

    我有一个 WinForms 应用程序 该应用程序有一个 首选项 部分 用户可以在其中选择显示警报时播放哪些声音 是否可以有一个组合框 用户可以从 Windows 存储的声音中进行选择 例如 紧急停止 紧急蜂鸣 等 这些可以在 控制面板 gt
  • 使用 C# 在 XML 文档中查找特定值的好方法是什么?

    我正在调用 Oracle 公开的 WebService 它接受 ItemID 的输入并向我返回相应的 Item Number 我想获取从响应中包含的 XML 返回的项目编号 XML 看起来像这样
  • WiX 安装程序在 vs 2012 上不起作用

    我想为我的应用程序创建一个安装程序 我已经下载了 WiX 3 6 并将其安装在 vs 2012 上 创建简单的winform应用程序 将 WiX 安装项目添加到我的解决方案中 右键单击参考并将我的 winform 应用程序添加到安装程序的参
  • 基于 C++ 组件的类

    Hi 我正在使用容器编写一个基于组件的类 但是在考虑了许多不同的方法之后 我找不到真正符合我想要的方法 这是总体思路的一个例子 我已经写的代码 Abstract class Component class Component public
  • 成员函数的Decltype

    class A int f int x int j return 2 decltype f p 给我错误 error decltype cannot resolve address of overloaded function 我不明白为什
  • 实现多个接口的 Service Fabric Actor 接口

    我正在构建一个应用程序 其中有多个不同的参与者类型 这些参与者类型对于某些不同的数据对象具有相同类型的行为 CRUD 为了更轻松地创建处理此问题的代码 我尝试创建一个这些参与者可以实现的接口 这意味着我有一个看起来像这样的参与者界面 pub
  • 对数据绑定组合框进行排序的最佳方法是什么?

    我对此做了一些研究 似乎对数据绑定组合框进行排序的唯一方法是对数据源本身进行排序 在本例中为数据集中的数据表 如果是这种情况 那么问题就变成对数据表进行排序的最佳方法是什么 组合框绑定在设计器中设置初始化使用 myCombo DataSou
  • 类型与创建 CLR 存储过程不匹配

    我在程序集中有一个如下所示的方法 namespace MyNameSpace public class MyClass Microsoft SqlServer Server SqlProcedure public static void M
  • Windows 安装程序 (C#) 错误代码 2869

    我在 VS 2005 中有一个项目 其中有一个控制台应用程序和一个与安装该应用程序关联的安装项目 我在控制台应用程序中还有一个安装程序类 安装项目将使用它在安装前进行一些验证 这些任务正在检查数据库连接字符串并检查某些目录位置以确保它们在安

随机推荐

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

    我将 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