提问人: 提问时间:3/25/2021 最后编辑:Striezel 更新时间:3/27/2021 访问量:132
分配内存 - 指针
Allocating memory - Pointers
问:
我想知道何时或是否必须删除此对象。 下面是一个基本类 Object 的构造函数 Object.cpp:
Objects::Objects{
Obj one = new Obj;
Obj two = new Obj;
}
我知道在分配内存时,您应该在某个时候删除它,但是我已经在构造函数中分配了内存,并希望再次使用变量 1 和 2。我什么时候删除它们?
答:
我想知道何时或是否必须删除此对象。
如果分配了 with 而不解除分配,则会泄漏内存。new
我已经在构造函数中分配了内存,并想再次使用变量 1 和 2,我什么时候删除它们?
如果要在构造函数中初始化变量并稍后使用它们,则应使用非静态成员变量,而不是构造函数中的自动变量。
如果要在构造函数中分配内存,并使用成员指向它,则通常应在析构函数中解除分配。有关详细信息,请参阅资源获取是初始化惯用语。但是,不应使用裸属指针,也不应不必要地使用动态分配。下面是一个简单的例子,我推荐它作为你的第一个选择:
struct Objects {
Obj objects[2];
};
评论
简单来说,每当你做一个 ,你都应该做一个相应的.new
delete
在您的例子中,您最迟必须在删除对象之前删除已分配的对象,这意味着在 中,这也意味着您必须保留一种访问析构函数的 和指针的方法(一种方法可能是将它们设置为 的成员)。当前案例无法执行此操作,因为 和 是局部变量,而不是指针。Obj
Objects
destructor
Objects
one
two
Objects
one
two
它可能如下所示:
class Objects
{
public:
Objects();
virtual ~Objects();
private:
Obj* one;
Obj* two;
};
Objects::Objects{
one = new Obj;
two = new Obj;
}
Objects::~Objects{
delete one;
delete two;
}
在处理资源管理时,您需要注意一些规则,而 3/5/0 规则将指导您在资源管理方面创建健壮的代码。
另一点评论:
使用智能指针可能会更好,因为即使使用我在帖子中提到的方法,如果在代码执行行之前发生异常或崩溃,您仍然会遇到内存泄漏,如此处所述delete
评论
new Obj
new
delete
smart pointers
I would like to know when and if I need to use delete
上一个:c++ 接口必须遵守五法则吗?
下一个:(C++) STL 向量实现
评论
~Objects
new
Obj one = new Obj;
会是一个错误。 不是指针。也许你想要,但我质疑你为什么要创建构造函数完成后不存在的本地对象。one
Obj one;