我的以下问题是关于内存管理.我有一个int变量没有在类中动态分配,比如说invar1.我将此int的内存地址传递给另一个类构造函数.那个班级做到了这个:
class ex1{
ex1(int* p_intvar1)
{
ptoint = p_intvar1;
}
int* ptoint;
};
Run Code Online (Sandbox Code Playgroud)
我应该删除ptoint吗?因为它具有动态分配的int的地址,所以我认为我不需要删除它.
我再次向一个带有new运算符的类声明一个对象:
objtoclass = new ex1();
Run Code Online (Sandbox Code Playgroud)
我将它传递给另一个班级:
class ex2{
ex2(ex1* p_obj)
{
obj = p_obj;
}
ex1* obj;
};
Run Code Online (Sandbox Code Playgroud)
当我已经删除了objtoclass时,我应该删除obj吗?
谢谢!
Lig*_*ica 12
因为它具有动态分配的int的地址,我认为我不需要删除它.
正确.
当我已经删除了objtoclass时,我应该删除obj吗?
没有.
回想一下,你实际上并没有删除指针; 你正在使用指针删除他们指向的东西.因此,如果您同时写了两个,delete obj并且delete objtoclass因为两个指针都指向同一个对象,那么您将删除该对象两次.
我会提醒你,这是一个非常容易犯错的错误,你的ex2类,其中指向对象的所有权语义并不完全清楚.您可以考虑使用智能指针实现来消除风险.
您可以在智能指针(shared_ptr,unique_ptr)的帮助下摆脱原始指针并忘记内存管理.
智能指针负责在超出范围时释放内存.
这是一个例子:
#include <iostream>
#include <memory>
class ex1{
public:
ex1(std::shared_ptr<int> p_intvar1)
{
ptoint = p_intvar1;
std::cout << __func__ << std::endl;
}
~ex1()
{
std::cout << __func__ << std::endl;
}
private:
std::shared_ptr<int> ptoint;
};
int main()
{
std::shared_ptr<int> pi(new int(42));
std::shared_ptr<ex1> objtoclass(new ex1(pi));
/*
* when the main function returns, these smart pointers will go
* go out of scope and delete the dynamically allocated memory
*/
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
ex1
~ex1
Run Code Online (Sandbox Code Playgroud)