使用有序映射删除共享指针

deleting shared pointers by using an ordered map

本文关键字:删除 共享 指针 映射      更新时间:2023-10-16

我目前正在用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的内容。