【问题标题】:Memory leak? assigned a deleted pointer with a new operator [duplicate]内存泄漏?为已删除的指针分配了新的运算符 [重复]
【发布时间】:2012-11-14 16:15:14
【问题描述】:

可能重复:
C++ delete - It deletes my objects but I can still access the data?

我想检查以下简单代码是否存在内存泄漏。在函数中,它删除一个指针并将一个新对象分配给这个指针。这合法吗?在 g++ 编译器下,即使我删除了测试指针,我仍然可以访问它的成员,这对我来说看起来很奇怪。

class cTest{
public:
  cTest(double _m){
    m=_m;
}
  ~cTest(){}

  double m;
};

void function (cTest * test){
  delete test;
  std::cout<<test->m<<std::endl;
  test= new cTest(1.2);
}
int main(){
  cTest *t = new cTest(0.1);
  std::cout<<t->m<<std::endl;
  function (t);
  std::cout<<t->m<<std::endl;
  delete t;
  return 0;
}

打印出来

0.1

0.1

1.2

【问题讨论】:

标签: c++ memory-leaks


【解决方案1】:

每当您在其生命周期结束后访问指针时(例如,堆栈分配的对象或在 delete 之后),您都会偶然发现 未定义的行为,这比错误更糟糕,因为它可能工作并在它决定时突然崩溃。

指针不再有效,数据仍然存在,因为每个不必要的操作都不是在 C++ 中完成的,这就是为什么在你的情况下它可以工作。

【讨论】:

    【解决方案2】:

    是的,它泄漏了。 function实际上并没有修改main中t的值(因为它的参数是传值的)。

    您通常可以引用已删除的内存,但这是一个错误(并且不可靠)。

    【讨论】:

      【解决方案3】:

      首先,您的代码中有两个错误。

      指针不是值。

      void function (cTest * test){
        delete test;
        std::cout<<test->m<<std::endl;
        test= new cTest(1.2);
      }
      

      test 未被覆盖。可能,您希望重写指针值,但它不能。 如果要这样做,请使用指针CTest** test 的指针来定义参数。或者使用返回值来给出一个新的指针值。

      #include <iostream>
      
      class cTest{
      public:
        cTest(double _m){
          m=_m;
      }
        ~cTest(){}
      
        double m;
      };
      
      void function (cTest** test){
        delete *test;
        std::cout<<(*test)->m<<std::endl;
        *test= new cTest(1.2);
      }
      int main(){
        cTest *t = new cTest(0.1);
        std::cout<<t->m<<std::endl;
        function (&t);
        std::cout<<t->m<<std::endl;
        delete t;
        return 0;
      }
      

      但我认为这段代码不太合理。

      【讨论】:

      • 当然,覆盖时应该使用解引用。
      【解决方案4】:

      是的,第一个分配的对象存在泄漏和双重删除。 main 中的 't' 继续指向第一个对象,因为指针不是通过引用或双指针传递给函数的。

      【讨论】:

        猜你喜欢
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 2013-04-20
        • 2022-01-17
        • 2021-06-14
        • 1970-01-01
        相关资源
        最近更新 更多