0

可能重复:
C++ 删除 - 它删除了我的对象但我仍然可以访问数据?

我想检查以下简单代码是否存在内存泄漏。在函数中,它删除一个指针并将一个新对象分配给这个指针。这合法吗?在 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

4

4 回答 4

1

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

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

于 2012-11-27T04:45:15.887 回答
1

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

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

于 2012-11-27T04:46:31.933 回答
1

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

指针不是值。

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;
}

但我认为这段代码没有什么意义。

于 2012-11-27T04:47:01.880 回答
1

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

于 2012-11-27T04:48:54.890 回答