通过智能指针重置对象

Resetting an object through smart pointer

本文关键字:对象 指针 智能      更新时间:2023-10-16

我是c++的新手,我想知道重构/重新初始化对象的最佳方法是什么?我的最小代码是这样的:

typedef boost::shared_ptr<Object> PObject;
int main()
{
    PObject SomeObject;
    SomeObject = PObject(new Object);
    // some code
    *SomeObject = Object();
}
我觉得那样做不对。谁能告诉我做这件事的最好方法?我只是想知道如何重建/重新初始化一个对象。谢谢!

当使用shared_ptr时,您可以使用reset -方法:

SomeObject.reset(new Object);

或者,异常安全的替代方法(也应该用于初始化):

SomeObject = make_shared<Object>();

这两个语句使得shared_ptr指向一个新创建的Object。引用同一对象的其他shared_ptr不会受到影响。如果这个shared_ptr是唯一指向旧对象的,它将被销毁。

游戏介绍:

shared_ptr<int> foo = make_shared<int>(23);
shared_ptr<int> bar = foo;
std::cout << *foo << ", " << *bar << std::endl; // prints "23, 23"
*foo = 42;
std::cout << *foo << ", " << *bar << std::endl; // prints "42, 42"
bar = make_shared<int>(23);
std::cout << *foo << ", " << *bar << std::endl; // prints "42, 23"

你到底想做什么?

  • 如果您想删除旧对象并从头创建一个新对象,由相同的指针指向,您可以执行SomeObject = new Object。如果您愿意,您可以显式重置共享指针,以明确旧对象已删除。
  • 如果你想重置对象的内容,而不释放和重新分配它,那么,只要它有一个正确实现的赋值操作符[1],你给它赋一个默认构造的对象的习惯用法就可以工作*PObject = Object()

[1]警告:如果对象成员本身是智能指针,编译器生成的赋值操作符通常不会按您的要求执行。它将创建一个"浅"复制:两个对象,但它们的所有智能指针将指向相同的对象,这意味着如果一个改变,另一个也会改变。

也许最好的方法是用一个"reset"函数来编写你的对象,它将所有字段设置为一个干净的状态,然后(a)在构造函数中使用该函数,(b)在此时调用该函数。如果你不想这样做,那么创造一个新的游戏对象更有可能是你想要的,但两种方法都是正确的,尽管它们在概念上非常不同,但两种方法都可行。

这取决于您实际想要实现的目标。您所展示的代码将更改所有客户机通过shared_ptr指向的值。如果那是你想做的,你的方法是好的。

如果您想为一个客户端获取一个新对象。shared_ptr::reset是正确的做法。

然而,在c++中,值通常优于共享对象。除非有充分的理由使用免费商店,否则不要这样做。

如果您想要重新初始化对象,那么您正在做的是正确的事情。

使用默认构造函数创建的临时对象调用SomeObject所指向的原始对象的赋值操作符。