可能重复:
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
答案 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'继续指向第一个对象,因为指针未通过引用或双指针传递给函数。