【问题标题】:Are shared_ptr on static objects good?静态对象上的 shared_ptr 好吗?
【发布时间】:2017-06-04 17:25:29
【问题描述】:

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

一种方法是使用指向该资源的 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();

}

【问题讨论】:

  • 这里根本不需要shared_ptr。
  • 智能指针用于更好地管理 动态 生命周期。静态变量已经有一个 static 生命周期。
  • “一种方法是使用指向该资源的 RAW 指针” 显而易见的做法是使用对资源的引用。你为什么不想这样做?
  • @Andreas:“我只需要一个指向具有 IDoSomething 接口的对象的指针”听起来你已经知道答案了。
  • @Chris 不,你没有。您可以从自动对象构造shared_ptr。你只需要让删除器正确,就像让它什么都不做。

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


【解决方案1】:

以下两行无效。

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

pt 在您的进程生命周期结束时被销毁时,它将delete stst 从未与匹配的 new 一起分配。这是未定义的行为。

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

【讨论】:

  • 使用shared_ptr并没有错,默认删除器使用shared_ptr是错误的。
  • "静态对象的生命周期非常简单" 命名空间作用域静态函数作用域静态?
【解决方案2】:

假设我(作为课程作者)不知道对象是静态的还是动态的

需要不可知的代码绝对应该使用shared_ptr&lt;T&gt;

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

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

这很好:

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

并且pt 可以与“普通” shared_ptr 实例互换使用。 std::shared_ptr 在这方面特别方便,因为删除器的存在与否不会影响指针类型(相比之下,std::unique_ptr&lt;T, custom_deleter&lt;T&gt;&gt; 是与 `std::unique_ptr> 不同的类型)

以下描述了指定不执行任何操作的删除器的这种方式和其他方式:

【讨论】:

    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2010-11-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多