如何检测内存错误的来源 我使用Visual Studio 2003,我有一个使用微软STL的C++应用程序,它内存错误:

如何检测内存错误的来源 我使用Visual Studio 2003,我有一个使用微软STL的C++应用程序,它内存错误:,c++,visual-c++,memory,C++,Visual C++,Memory,代码是: instrcutions; function1(); function2(); ... functionN(); 我修改它: list<A*> l1; instrcutions; function1(); function2(); ... functionN(); 列表l1; 仪器; 功能1(); 函数2(); ... 函数n(); 在调试模式下执行时,我看到列表的大小在增长,变得越来越小,并且列表点上的数据也在改变 由于存在“不知道”列表的函数,因此不能故意修改列表

代码是:

instrcutions;
function1();
function2();
...
functionN();
我修改它:

list<A*> l1;
instrcutions;
function1();
function2();
...
functionN();
列表l1;
仪器;
功能1();
函数2();
...
函数n();
在调试模式下执行时,我看到列表的大小在增长,变得越来越小,并且列表点上的数据也在改变

由于存在“不知道”列表的函数,因此不能故意修改列表。 我试图更改列表的名称:同样的行为也会发生

任何关于什么会导致这种问题的想法,在代码中搜索的位置,或者免费的工具来跟踪错误的内存访问


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

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

问问自己以下问题:

  • 存储在
    列表中的指针是指向堆上的对象还是堆栈上的对象
    
  • 您是
    delete
    ing还是
    free
    ing
    列表中的指针,分配是否与释放匹配
  • 您真的需要指针吗,还是可以只使用值类型

  • 如果您在跟踪#2时遇到问题,可以使用
    shared_ptr
    而不是原始指针(请确保您没有循环引用)。

    我不确定是否理解您的问题-您是否在修改列表?将其传递给任何函数

    如果确定要覆盖某个位置的内存,请在调试模式下运行时尝试使用该函数。我已经成功地将它用于检测内存覆盖,方法是使用std::couts包装重要语句并调用_heapchk():


    std::cout列表的内容是指向类型A的对象的指针。。这是一个猜测,因为您的问题似乎非常普遍,您是否考虑过列表对象不是指针,因此在创建要传递到列表对象的对象时。列表对象不再存在,因为您已将其进一步向下推到堆栈上。也许让你的清单成为对象

     list<A*>* l1;
    
    列表*l1;
    
    列表l1; 就我所记得的列表中包含的fast.size()函数的大小而言,这是可以使用的

    我只是不记得vs2003是否支持内存写入断点。VS2005-绝对是


    因此,我们的想法是:获取列表中“size”成员的地址(通过打开头文件找到它),并在数据更改时设置断点。在任何情况下,您都会抓到违规者,不过它通常是隐藏的回推或写入随机堆栈内存,std::list对象本身就出现在该内存中。

    在Linux中,您可以并且应该使用
    valgrind
    。如果您的代码是可移植的,您可以在Linux机器上用GCC编译它,并在那里测试错误。请注意,如果容器的元素类型是指针,则会引发问题,您必须非常小心地编写此类代码。如果它是visual Studio特定的,是否应标记为
    visual-c++
    ?“元素类型是指针,则会引发问题,您必须非常小心地编写此类代码。”代码中充满了它!。。。有些Windows DLL(我没有代码)和成千上万的代码行,专门针对VisualC++。我不认为在linux中很容易实现它。我不碰这个列表!这才是最奇怪的。它仍然是空的。唯一使用列表的指令是声明“LISTL1”;我需要指针。。。除了这个问题之外,还有其他指向堆中结构的列表,这些列表也会在没有显式调用它们的情况下被修改。但是您说:“在调试模式下执行时,我看到列表的大小不断增大,变得越来越小,列表点的数据也会发生变化。”如果你不碰它,那怎么可能呢?你是在用指向堆栈的指针做指针运算吗?如果是这样的话,错误就会出现在代码中。“如果你不碰它,怎么可能呢?”这是一个可怕的问题!!!我可以在同一个函数中声明另一个列表。它也被修改,没有被代码“触动”!!“您正在使用指向堆栈的指针执行指针算术吗?”否“列表按良好顺序递减表示不希望使用列表的功能”。您的意思是,代码处理l1作为列表存储的内存(即使未分配此内存)?陌生人,我在程序的同一个地方创建了另一个列表l2,同样的事情发生在l2上!否:不修改它,也不将它传递给任何函数。_heapchk()制作列表对象的thx:列表l1;很好。但我需要列表l1;因为多态性。需要在列表中放置子结构。但总体而言,此问题表示必须解决的某个错误的内存错误。内存错误,您是否有可能尝试访问列表中不存在的元素。您知道,当您不创建任何对象时,您只创建指向对象的指针。所以现在你所拥有的只是一个空杯子,你正试图从杯子里取水。但是没有,所以这会给你一个内存错误。所以,你需要做的是每次你想添加一个新的对象到你的列表中放置:列表杯//这是一个空杯子A*water1=新的A();杯子。向前推(水1);我知道。这就是我对其他列表所做的。cup.size()给出0,然后是1…然后是5,然后是4,等等。不接触列表。。。当然,这个列表指向了不远处的物体。
     list<A*>* l1;