不说哪里有难度,分享一个我最近的案例吧。
有一个平台,内部RAM仅384kB,无法容纳含大图像缓冲区数组的class对象。为解决此问题,可外接一片PSRAM以扩展存储空间,从而放置该对象。
当需要用 RAII 管理片外 RAM 对象时,你自然会想到使用 unique_ptr。这是合理的選擇。
你需要自定义删除器,因此前往 cppreference 查阅 unique_ptr 关于分配器的相关内容。
你添加了删除器并使用函数指针,却发现 void(*)(Derived*) 不能隐式转换为 void(*)(Base*)。这使得 unique_ptr 无法支持多态类型,也无法将不同派生类的对象存入同一容器中。这是因为删除器的类型不匹配,破坏了多态特性。
你在Google搜索了unique_ptr多态删除器的相关内容后,找到了2014年提出的N3974提案。原来有位前辈曾遇到与你相同的问题,并提出了相应的解决方案,但遗憾的是,这一提案至今仍未被采纳。
你突然崩溃,关掉电脑外出散心。路上灵光一闪,想到用 std::function 擦除类型可行,立刻跑回家,在 35 至 39 行写下了相关代码实现这一思路。
你不禁感慨,C++ 本身已够复杂,用于嵌入式平台更是麻烦重重,问题频出。
感谢评论区大佬 @凄临雨 的指点,我意识到无捕获的 lambda 表达式可以转化为函数指针。因此,将原本的 `std::function` 替换为 `void(*)(void*)` 是更优的选择。这种方式效率更高且表达更直接。再次对大佬表示感谢!
接下来,你需要实现一个支持无界数组的 unique_ptr 和 make_unique,以适应动态大小的需求,确保资源管理安全且高效,避免内存泄漏问题。这是对之前内容的进一步扩展和完善。