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

我在嵌入式系统上的经验是,您将在堆栈上尽可能多地使用静态分配,这将阻止使用智能指针及其所有有用的功能。

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

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

最佳答案

实际上,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

关于c++ - 用于嵌入式的STL智能指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57617270/

10-11 00:32