c++ - 如何更改 shared_ptr 中的指针而不失去删除内存的能力?
问题描述
我遇到了一个问题std::shared_ptr
。我有一个代码:
void Receive(const std::shared_ptr<char[]>& data, uint32_t length) {
this->next->Receive(data + 2, length - 2);
}
我需要将 shared_ptr 增加 2 而不会失去删除内存的能力。
我不想复制数据,因为数据已经在内存中并且我拥有数据。如果我可以更改指针而不损失性能,那么复制数据只是为了替换和删除旧数据是愚蠢的。shared_ptr 可以包含并返回一个指针,但删除另一个?
据我所知,shared_ptr 的内部包含一个指向get()
函数返回的数据的指针,并包含对控制块的引用,该控制块对引用进行计数,并且应该在所有引用都消失后删除内存。
那么,由于它包含与控制块分开的指针,也许我可以在不改变指向控制块中分配的内存块的指针的情况下以某种方式更改它,而不会失去删除内存的能力?如果我不能,也许我可以做到这一点boost::shared_ptr
?
我还没有检查过。我不使用Boost库,但如果它对我有帮助,我会的。
解决方案
是的,这就是别名构造std::shared_ptr
函数的用途。它保留相同的控制块,但它允许您使用另一个指针。
签名是
template< class Y >
shared_ptr( const shared_ptr<Y>& r, element_type* ptr ) noexcept;
在你的情况下,那将是
void Receive(const std::shared_ptr<char[]>& data, uint32_t length) {
std::shared_ptr<char[]> alias(data, data.get()+2);
this->next->Receive(alias, length - 2);
}
但我确实质疑shared_ptr
在这种情况下的使用。在这种情况下,您真的拥有共享所有权吗?你不能找出可以拥有这个内存的代码的一部分吗?
推荐阅读
- r - 如何计算具有变化参数的积分并将每个结果记录为R中的序列?
- typescript - ES6 模块导入不适用于 MP3 文件
- ncurses - 有没有办法防止 libcaca 在使用 ncurses 或原始驱动程序时显示闪烁的文本?
- vba - 将表单上的 ListBox 选定值放入报表的文本框中
- swiftui - 在 SwiftUI 中删除 .onDelete 上的弹性顶部动画
- node.js - 在 Dreamhost 上部署 Node.js 服务器
- javascript - 将 Ajax Json 字符串转换为我的 Ajax Get 脚本的 JS 对象
- python - 我如何使硒的响应进入不和谐状态
- javascript - Outlook 的 Office 加载项 - 有时发件人的电子邮件地址变为 LegacyExchangeDN
- python - 有没有办法用熊猫计算赛程的输赢记录?