使用有序映射删除共享指针
deleting shared pointers by using an ordered map
我目前正在用c ++编写一个shell,其文件系统在主内存中实现。我正在尝试通过以下方式将指向inode的指针存储到有序映射中的纯字段或目录:
using inode_ptr = shared_ptr<inode>;
map<string,inode_ptr> dirents;
所以基本上字符串将映射文件或目录。对于 rm"remove 函数",我试图做的是使用 delete 来释放指针指向的内容和指针本身:
void directory::remove (const string& filename) {
DEBUGF ('i', filename);
delete dirents[filename];
dirents.erase(filename);
}
所以基本上,我解除分配对象和指针,然后将其从映射中删除;但是,我收到一个编译器错误,其中指出以下内容:
error: type ‘std::map<std::basic_string<char>, std::shared_ptr<inode> >::mapped_type {aka class std::shared_ptr<inode>}’ argument given to ‘delete’, expected pointer
delete dirents[filename];
我做错了什么?
我也认为这个想法在某种程度上是错误的,因为目录的删除必须是递归的。消除 ptr 指向的内容并不能摆脱整个链条;但是,我不知道这是不是真的。
您的问题在于尝试删除std::shared_ptr<T>
。您不会在该对象上执行delete
。它的析构函数为您做您真正想要的。只需以指定的键调用地图上的erase
,在擦除该对象时,如果没有剩余shared_ptr
引用此分配,析构函数将自动delete
内容(非常好的点user4581301
(。您的函数如下所示:
void directory::remove (const string& filename) {
DEBUGF ('i', filename);
dirents.erase(filename); // erasing that object makes it call a delete on content
}
编辑:只是一些快速提示 - 如果您的map
提供了访问这些指针的唯一方法,请考虑使用std::unique_ptr<T>
而不是std::shared_ptr<T>
。
*如果您真的想在那里执行delete
,我强烈建议您切换到独特的指针。共享内存的使用表明可能还有其他一些指针指向要解除分配的内存。如果是这样的话 - 你原来的方法不正确。要么在此处使用std::unique_ptr
,要么不要假设您可以删除ptr
的内容。
相关文章:
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 从矢量或地图中删除共享指针
- CMake 添加和删除宏定义以编译共享库/可执行文件
- 如何通过指向元组的共享指针删除对象
- 提升进程间共享内存删除、权限和输出文件
- 使用有序映射删除共享指针
- 调用 shmdt() 后无法删除共享内存段
- 唯一/共享 ptr 用于在数组超出范围后自动删除阵列
- 升级分解共享内存删除对象而无需销毁
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 如何从集合中删除共享的 PTR 元素
- 提升共享指针自定义删除器示例
- 如何解决删除其他人之间共享的对象的问题
- 使用共享_ptr删除列表中的对象
- 删除与其他类共享的指针
- CreateFileMapping() 即使在重新启动后也会返回"already exists";如何删除旧的命名共享内存?
- 从 Android NDK 共享对象中删除异常/展开函数
- C++析构函数删除共享内存
- 提升中的异常:进程间,共享内存对象删除
- 我可以隐藏或删除共享库中的类名吗