通过智能指针重置对象

时间:2011-12-20 18:06:11

标签: c++ pointers smart-pointers

我是C ++的新手,我想知道重建/重新初始化对象的最佳方法是什么?我的最小代码如下所示:

typedef boost::shared_ptr<Object> PObject;

int main()
{
    PObject SomeObject;

    SomeObject = PObject(new Object);
    // some code
    *SomeObject = Object();
}

我觉得这不是正确的做法。有人能告诉我最好的方法吗?我只是想知道如何重建/重新初始化一个对象。谢谢!

4 个答案:

答案 0 :(得分:5)

使用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" ,它将被销毁。

举例说明:

{{1}}

答案 1 :(得分:2)

你真的想做什么?

  • 如果要删除旧对象并从头创建一个新对象(由同一指针指向),则可以执行SomeObject = new Object。如果您愿意,可以显式重置共享指针,以清除旧对象被删除。
  • 如果你想重置对象的内容而不解除分配并重新分配它,那么,只要它有一个正确实现的赋值运算符[1],你为它分配一个默认构造对象的习惯就可以了{{li] 1}}

[1]警告:如果对象成员本身就是智能指针,这是非常重要的,编译器生成的assignemnt操作符通常不会做你想要的。它将创建一个“浅”副本:两个对象,但所有智能指针都指向相同的对象,这意味着如果一个更改,另一个也会改变。

最好的方法是使用“reset”函数编写对象,将所有字段设置为干净状态,然后(a)在构造函数中使用该函数,(b)在此时调用该函数。如果你不想这样做,创建一个新的游戏对象更有可能是你想要的,但是无论哪种方式都是正确的,即使它们在概念上非常不同,也可以在这里工作。

答案 2 :(得分:0)

这取决于你真正想要实现的目标。 您显示的代码将更改所有客户端通过shared_ptr指向的值。如果这就是你想要做的,你的方式就是好的。

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

但是,在C ++中,值通常比共享对象更受欢迎。除非有充分理由真正使用免费商店,否则不要这样做。

答案 3 :(得分:0)

如果要重新初始化对象,您正在做的是正确的事情。您正在使用SomeObject指向的原始对象调用赋值运算符,并使用默认构造函数创建临时Object。