shared_ptr对静态对象有好处吗?

时间:2017-01-19 20:55:00

标签: c++ c++11 pointers static smart-pointers

我想知道静态对象上的智能指针是否合理。例如,假设我有一些静态资源,并希望将对该静态资源的引用传递给需要使用这些资源的其他对象。

一种方法是使用指向该资源的RAW指针。但现在我想知道智能指针(shared_ptr)是否是更好的方法,如果是,如何正确地做到这一点。 (智能指针也应该是静态的吗?)。

问题的背景:如果不再有持有智能指针的对象,智能指针指向的静态对象将被释放(这不是最好的想法......)。

一个例子(在运行结束时以崩溃结束):

struct SomeType {
  SomeType() { cout << "ctor..." << endl; }
  ~SomeType() { cout << "dtor..." << endl; }

  void sayHello() { cout << "Hello!" << endl; }
};


void someFunction(shared_ptr<SomeType> smartPointer) {
  smartPointer->sayHello();
}

static SomeType st;
static shared_ptr<SomeType> pt{ &st };

void anotherFunction() {

  someFunction(pt);
}

int main() {
  anotherFunction();

  cin.get();

}

2 个答案:

答案 0 :(得分:7)

以下两行无效。

static SomeType st;
static shared_ptr<SomeType> pt{ &st };

如果pt在您的流程生命周期结束时被销毁,则会delete stst从未分配过匹配的new。这是未定义的行为。

shared_ptr对于管理共享对象的复杂生命周期很有用,而static对象的生命周期非常简单。使用shared_ptr来管理static个对象是不正确的,这样做没有任何好处。

答案 1 :(得分:-1)

  

让我们假设我(作为班级作者)不知道对象是静态的还是动态的

绝对需要不可知的代码应该使用shared_ptr<T>

您提供的此代码无效,因为它会导致删除具有静态生命周期的对象。

static SomeType st;
static shared_ptr<SomeType> pt{ &st };

这很好:

static SomeType st;
static shared_ptr<SomeType> pt{ std::shared_ptr<SomeType>{}, &st };

并且pt可与&#34;正常&#34;互换使用shared_ptr实例。 std::shared_ptr在这方面特别方便,因为删除器的存在与否不会影响指针类型(相反,std::unique_ptr<T, custom_deleter<T>>是与`std :: unique_ptr&gt;不同的类型)

这个和其他指定不执行任何操作的删除器的方法描述于: