如何检测内存错误的来源

时间:2011-11-09 14:02:57

标签: c++ visual-c++ memory

我正在使用visual studio 2003,我有一个使用microsoft STL的c ++应用程序,它有一个内存错误:

代码是:

instrcutions;
function1();
function2();
...
functionN();

我修改它:

list<A*> l1;
instrcutions;
function1();
function2();
...
functionN();

在调试模式下执行时,我看到列表的大小在增长,变小,列表中的数据变化了。

由于功能“不知道”列表存在,列表不能故意修改。 我尝试更改列表的名称:发生相同的行为。

任何可能导致此问题的原因,在代码中搜索的地方,以及跟踪错误内存访问的免费工具。

有人可以确认visual studio无法检测到我所描述的错误内存访问吗?

5 个答案:

答案 0 :(得分:0)

除非您将列表的引用或指针传递给某些函数,否则列表的大小不应受任何函数的影响。你所描述的也不是记忆问题表现出来的一般方式。列表按良好顺序递减表示不希望使用列表的功能,内存问题会导致列表崩溃,无理由或某些其他类型的“奇怪”问题。

答案 1 :(得分:0)

问自己以下问题:

  1. 指针存储在list中是指向堆上还是堆栈上的对象?
  2. 您是deletefree list中的指针,并且分配是否符合解除分配?
  3. 你真的需要指针,还是只能使用价值类型?
  4. 如果您在跟踪#2时遇到问题,可以使用shared_ptr而不是原始指针(但请确保您没有循环引用)。

答案 2 :(得分:0)

我不确定我理解你的问题 - 你是否正在修改清单?将它传递给任何函数?

如果您确定要在某处覆盖内存,请在调试模式下运行时尝试使用_heapchk()功能。我已经成功地使用它来检测内存覆盖,方法是用std :: couts包装重要语句并调用_heapchk():

std::cout << "Loc 0" << std::endl;
callFunction(parameter);
_heapchk();
std::cout << "Loc 1" << std::endl;

这可以帮助您找到代码中的 where ,但不会发生内存覆盖。

答案 3 :(得分:0)

列表的内容是指向A类对象的指针但是..这是一个猜测,因为你的问题看起来很一般,你是否想过列表对象不是指针所以当你创建对象传递给列表对象时。列表对象不再存在,因为您已将其向下推到堆栈上。也许让你的列表对象..

 list<A*>* l1;

答案 4 :(得分:0)

列表l1; 据我记得列表包含它的大小以便快速.size()函数工作,这可以使用。

我只是不记得vs2003是否支持内存写入断点。 VS2005 - 肯定会。

所以想法:在列表中获取'size'成员的地址(通过打开头文件找到它)并在数据更改时设置断点。在任何情况下你都会捕获违规者,然而它通常是隐藏的push_back或写入std :: list对象本身所呈现的随机堆栈内存。