【问题标题】:pass stack variable to function that takes a std::shared pointer将堆栈变量传递给采用 std::shared 指针的函数
【发布时间】:2021-12-04 14:59:32
【问题描述】:

如果我有一个全局变量或堆栈变量,我可以将它传递给一个函数,该函数采用 std::shared_ptr 和这样的模板类:

template<class T> class shared_ptr_stack:public std::shared_ptr<T> {
    public:
    shared_ptr_stack(T * target):std::shared_ptr<T>(target, [](T * t){}){};
    };
};

目标是避免在没有引用时破坏或删除内存。代码在测试中编译和工作,但我担心我会调用未定义的行为或其他一些负面问题。

【问题讨论】:

  • 如果您的目标是避免堆分配,那么您还没有实现它,因为 shared_ptr 仍然需要分配其控制结构。如果你不想避免堆分配......为什么不直接使用堆而不是堆栈?
  • 从不是为它设计的类的公共继承是一个坏主意。您可以改为引入一个全局函数 make_shared_stack&lt;T&gt;,它构造一个带有无操作删除器的 shared_ptr
  • 那将是等待发生的未定义行为。该函数可能需要shared_ptr 是有原因的——我怀疑它会将指针隐藏在某个地方以备后用。您计划将一个很快超出范围的局部变量交给它,从而使隐藏的指针悬空。
  • @Eugene 如果从非为继承而设计的类派生的类没有成员,只有辅助函数会出现什么样的问题?

标签: c++ shared-ptr


【解决方案1】:

采用共享 ptr 的函数有权使您的数据无限期地保留。它可以将您的数据传递给不同的结构、线程等。

您的代码意味着,当堆栈帧超出范围或在静态销毁时,数据将变为垃圾,其中任何一个都可能在最后一个共享 ptr 副本死亡之前。

采用共享 ptr 的 API 正在请求该权限。你在骗它。

除此之外,您的代码很好。但是,我会使用工厂函数而不是子类。您还可以使用共享 ptr 的别名 ctor 来获取一些基于 RAII 的报告。

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 2010-10-13
    • 2012-01-18
    • 1970-01-01
    • 2014-10-17
    • 2020-01-03
    • 2021-12-30
    • 2020-12-17
    相关资源
    最近更新 更多