我正在使用visual studio 2003,我有一个使用microsoft STL的c ++应用程序,它有一个内存错误:
代码是:
instrcutions;
function1();
function2();
...
functionN();
我修改它:
list<A*> l1;
instrcutions;
function1();
function2();
...
functionN();
在调试模式下执行时,我看到列表的大小在增长,变小,列表中的数据变化了。
由于功能“不知道”列表存在,列表不能故意修改。 我尝试更改列表的名称:发生相同的行为。
任何可能导致此问题的原因,在代码中搜索的地方,以及跟踪错误内存访问的免费工具。
有人可以确认visual studio无法检测到我所描述的错误内存访问吗?
答案 0 :(得分:0)
除非您将列表的引用或指针传递给某些函数,否则列表的大小不应受任何函数的影响。你所描述的也不是记忆问题表现出来的一般方式。列表按良好顺序递减表示不希望使用列表的功能,内存问题会导致列表崩溃,无理由或某些其他类型的“奇怪”问题。
答案 1 :(得分:0)
问自己以下问题:
list
中是指向堆上还是堆栈上的对象? delete
或free
list
中的指针,并且分配是否符合解除分配?如果您在跟踪#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对象本身所呈现的随机堆栈内存。