Jon*_*han 0 c++ memory pointers set
#ifndef DELETE
#define DELETE(var) delete var, var = NULL
#endif
using namespace std;
class Teste {
private:
Teste *_Z;
public:
Teste(){
AnyNum = 5;
_Z = NULL;
}
~Teste(){
if (_Z != NULL)
DELETE(_Z);
}
Teste *Z(){
_Z = new Teste;
return _Z;
}
void Z(Teste *value){
value->AnyNum = 100;
*_Z = *value;
}
int AnyNum;
};
int main(int argc, char *argv[]){
Teste *b = new Teste, *a;
a = b->Z();
cout << "a->AnyNum: " << a->AnyNum << "\n";
b->Z(new Teste);
cout << "a->AnyNum: " << a->AnyNum << "\n";
//wdDELETE(a);
DELETE(b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道在这段代码中是否有内存泄漏它可以正常工作,*a
设置两次并AnyNum
在每个上打印不同的数字cout <<
但是我想知道_Z
在setter(new Teste
)之后发生了什么,我没有太多的知识指针/引用还没有,但对于逻辑我猜它是换新的变量,如果它正在泄漏,无论如何要完成这个而不必再设置一个_Z
?因为地址没有改变,只是我要使用的直接内存*&
而不仅仅是指针,但它会有所不同吗?
此行有内存泄漏:
b->Z(new Teste);
Run Code Online (Sandbox Code Playgroud)
因为功能的定义:
void Z(Teste *value){
value->AnyNum = 100;
*_Z = *value;
}
Run Code Online (Sandbox Code Playgroud)
看起来像没有参数的Z应该是一个getter并且带有参数的setter.我怀疑你打算这样做:
void Z(Teste *value){
value->AnyNum = 100;
_Z = value;
}
Run Code Online (Sandbox Code Playgroud)
(注意第三行)也就是说,将指针"value"赋给指针"_Z",而不是复制指向Z指向的值的值.有了这个,第一个内存泄漏将被解决,但代码仍然有一个,因为_Z可能已经持有一个指针.所以你必须这样做:
void Z(Teste *value){
value->AnyNum = 100;
delete _Z; // you don't have to check for null
_Z = value;
}
Run Code Online (Sandbox Code Playgroud)
正如另一条评论中所提到的,真正的解决方案是使用智能指针.对于相同的代码,这是一种更现代的方法:
using namespace std;
class Teste {
private:
boost::shared_ptr<Teste> Z_;
public:
Teste() : AnyNum(5), Z_(NULL)
{ }
boost::shared_ptr<Teste> Z()
{
Z_.reset(new Teste);
return Z_;
}
void Z(boost::shared_ptr<Teste> value)
{
value->AnyNum = 100;
Z_ = value;
}
int AnyNum;
};
int main(int argc, char *argv[]){
boost::shared_ptr<Teste> b = new Teste, a;
a = b->Z();
cout << "a->AnyNum: " << a->AnyNum << "\n";
b->Z(boost::shared_ptr<Teste>(new Teste));
cout << "a->AnyNum: " << a->AnyNum << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)