内存泄漏?使用新运算符分配了已删除的指针

时间:2012-11-27 04:41:14

标签: c++ memory-leaks

  

可能重复:
  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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

每当你在生命周期结束后访问一个指针(例如堆栈分配的对象或delete之后),你就会遇到未定义的行为,这甚至比一个错误还要糟糕,因为它可能会起作用,并在它决定时突然崩溃。

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

答案 2 :(得分: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;
}

但是我觉得这段代码不太合理。

答案 3 :(得分:1)

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