提问人: 提问时间:3/25/2021 最后编辑:Striezel 更新时间:3/27/2021 访问量:132
分配内存 - 指针
Allocating memory - Pointers
问:
我想知道何时或是否必须删除此对象。 下面是一个基本类 Object 的构造函数 对象.cpp:
Objects::Objects{
Obj one = new Obj;
Obj two = new Obj;
}
我知道在分配内存时,您应该在某个时候将其删除,但是我已经在构造函数中分配了内存,并希望再次使用变量一和二。我什么时候删除它们?
答:
1赞
eerorika
3/25/2021
#1
我想知道何时或是否必须删除此对象。
如果分配了 with 而不解除分配,则会泄漏内存。new
我已经在构造函数中分配了内存,并想再次使用变量 1 和 2,我什么时候删除它们?
如果要在构造函数中初始化变量并稍后使用它们,则应使用非静态成员变量,而不是构造函数中的自动变量。
如果要在构造函数中分配内存,并使用成员指向它,则通常应在析构函数中解除分配。有关详细信息,请参阅资源获取是初始化惯用语。但是,不应使用裸属指针,也不应不必要地使用动态分配。下面是一个简单的例子,我推荐它作为你的第一个选择:
struct Objects {
Obj objects[2];
};
评论
0赞
463035818_is_not_an_ai
3/25/2021
仅供参考,我尝试修复 OP 问题,但我的编辑与您的答案不同步。如果你觉得你可以回滚我的回滚;)
1赞
eerorika
3/25/2021
@largest_prime_is_463035818我不认为 OP 知道初始化自动变量和初始化构造函数中的成员变量之间的区别,因此“修复”可能会令人困惑。由于类型也是错误的,因此很难猜测任何一种方式。
4赞
Pat. ANDRIA
3/25/2021
#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
评论
1赞
HAL9000
3/25/2021
如果抛出异常,这也将泄漏内存。这就是为什么您应该始终使用智能指针或容器类的原因。永远不要尝试自己做/自己做。你很可能会搞砸它。但更好的是,如果可能的话(就像在本例中一样),你应该只内联对象。new Obj
new
delete
0赞
Pat. ANDRIA
3/25/2021
感谢您的评论,我同意您关于智能指针的看法。然而,我提供了这个答案,但没有谈论,因为最初的问题是,他提供了一个类似的例子。我在回复中加上你的评论。smart pointers
I would like to know when and if I need to use delete
评论
~Objects
new
Obj one = new Obj;
会是一个错误。 不是指针。也许你想要,但我质疑你为什么要创建构造函数完成后不存在的本地对象。one
Obj one;