分配内存 - 指针

Allocating memory - Pointers

提问人: 提问时间:3/25/2021 最后编辑:Striezel 更新时间:3/27/2021 访问量:132

问:

我想知道何时或是否必须删除此对象。 下面是一个基本类 Object 的构造函数 Object.cpp:

Objects::Objects{
    Obj one = new Obj;
    Obj two = new Obj;
}

我知道在分配内存时,您应该在某个时候删除它,但是我已经在构造函数中分配了内存,并希望再次使用变量 1 和 2。我什么时候删除它们?

C++ 指针 内存管理 析构函数 三法则

评论

1赞 0x5453 3/25/2021
通常,您将在相应的析构函数中删除它们(在本例中为 .)~Objects
2赞 463035818_is_not_an_ai 3/25/2021
这些是本地对象,因此您应该在离开构造函数之前删除它们,否则对它们的任何引用都将丢失,并且您有泄漏。话虽如此,很可能您不需要任何指针,而且您肯定不需要使用(我想您实际上想初始化成员,但这不是代码的作用,请澄清)new
0赞 drescherjm 3/25/2021
也许您不想使用原始指针,而是想要 std::unique_ptr<Obj>。另外,您确定要在构造函数中创建本地对象吗?
0赞 drescherjm 3/25/2021
Obj one = new Obj;会是一个错误。 不是指针。也许你想要,但我质疑你为什么要创建构造函数完成后不存在的本地对象。oneObj one;
1赞 ma1169 3/25/2021
尝试在这里使用搜索引擎,您会找到许多有关指针、stackoverflow.com/questions/tagged/pointers?tab=Votesstackoverflow.com/questions/655065/ 的有用参考资料......

答:

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

简单来说,每当你做一个 ,你都应该做一个相应的.newdelete

在您的例子中,您最迟必须在删除对象之前删除已分配的对象,这意味着在 中,这也意味着您必须保留一种访问析构函数的 和指针的方法(一种方法可能是将它们设置为 的成员)。当前案例无法执行此操作,因为 和 是局部变量,而不是指针。ObjObjectsdestructorObjectsonetwoObjectsonetwo

它可能如下所示:

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 Objnewdelete
0赞 Pat. ANDRIA 3/25/2021
感谢您的评论,我同意您关于智能指针的看法。然而,我提供了这个答案,但没有谈论,因为最初的问题是,他提供了一个类似的例子。我在回复中加上你的评论。smart pointersI would like to know when and if I need to use delete