【问题标题】:STL smart pointers for embedded用于嵌入式的 STL 智能指针
【发布时间】:2019-08-22 21:27:59
【问题描述】:

我一直在阅读 STL 并热衷于使用智能指针,我担心它们似乎严重依赖于动态分配,因此也依赖于堆。

我在嵌入式方面的经验是尽可能在堆栈上使用静态分配,这会阻止使用智能指针及其所有有用的功能。

我在这里遗漏了什么还是我的方法完全错误?

顺便说一句,我专注于 STM32 F4 和 H7s

【问题讨论】:

  • 如果你的对象是自动的,为什么你需要智能指针,你还需要智能指针的什么功能?
  • 非常相关/可能是骗子:stackoverflow.com/questions/42910711/…
  • @NathanOliver 在我看来像是骗子
  • 智能指针是一种工具。像任何工具一样,您应该知道它的作用,以便决定何时(以及何时不)使用它。如果自动(即本地/成员)变量可以以简单的方式解决您的问题,则无需使用智能指针。
  • 您真的想进行自定义的低级堆栈分配吗?您的对象需要拥有什么样的生命周期?

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


【解决方案1】:

std::unique_ptrstd::shared_ptr 实际上并没有假设他们管理的生命周期的对象是在堆上分配的。您可以为这两个对象定义一个自定义删除器,以便在智能指针超出范围时运行任意代码。

对于std::unique_ptr,自定义删除器是函数对象形式的附加模板参数,例如

auto CustomDeleter = [] (char *p) { delete [] p; };
std::unique_ptr <char, decltype (CustomDeleter)> up (new char [20], CustomDeleter);

对于std::shared_ptr,它是构造函数的附加参数,例如

std::shared_ptr <char> sp (new char [20], CustomDeleter);

请注意,对于std::shared_ptr,在堆上分配了一个(小)控制块(您不能将make_shared 与自定义删除器一起使用)。

当然,我的示例显示了堆上的分配,但这只是为了演示。

Live demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多