使用有序映射删除共享指针 我目前正在编写一个C++的shell,它的文件系统是在主内存中实现的。我试图以以下方式将指向inode的指针存储在有序映射中的普通字段或目录中: using inode_ptr = shared_ptr<inode>; map<string,inode_ptr> dirents;

使用有序映射删除共享指针 我目前正在编写一个C++的shell,它的文件系统是在主内存中实现的。我试图以以下方式将指向inode的指针存储在有序映射中的普通字段或目录中: using inode_ptr = shared_ptr<inode>; map<string,inode_ptr> dirents;,c++,C++,所以基本上,我解除分配对象和指针,然后从映射中删除它;但是,我收到一个编译器错误,该错误声明如下: 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 delet

所以基本上,我解除分配对象和指针,然后从映射中删除它;但是,我收到一个编译器错误,该错误声明如下:

 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];
错误:类型'std::map::mapped_type{aka class std::shared_ptr}'参数指定给'delete',应为指针
删除目录[文件名];
我做错了什么


我还认为这个想法是错误的,因为删除目录必须是递归的。消除ptr指向的内容并不能消除整个链;但是,我不知道这是不是真的。

您的问题在于尝试删除
std::shared\u ptr
。您不能对该对象执行
delete
。它的析构函数为你做你真正想要的。只需按指定的键在地图上调用
erase
,当您擦除该对象时,如果没有剩余的
共享\u ptr
引用该分配,析构函数将自动
删除该内容(非常好的一点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::UnQuyGPPT/<代码>,而不是<代码> STD::SyrdYPPTR < /C> > /P>
*如果您真的想在那里执行
delete
,我强烈建议您切换到独特的指针。使用共享指针表示可能有其他指针指向要释放的内存。如果是这样的话——你最初的方法是不正确的。在此处使用
std::unique_ptr
,或者不要假设您可以删除
ptr
s的内容。

不要删除-共享的_ptr将为您执行此操作(这就是它们的作用)。当发生以下任一情况时,仅删除对象并释放其内存:拥有该对象的最后一个剩余共享\u ptr被销毁;拥有该对象的最后一个剩余的共享ptr通过运算符=或reset()分配另一个指针。如何销毁ptr?正如pm100指出的,您可以调用
map
()的
erase
函数从列表中删除
共享ptr
。如果这是指向inode对象的最后一个对象,则对象将被删除。根据您对它的使用情况,
shared_ptr
可能不是适合您的智能指针。如果您想从映射中删除对象,则应考虑使用<代码> STD::UnQuyGPPT/<代码>。另一个值得经常问的问题可能是,如果不能通过代码< > iNoD</代码>代替<代码> STD::UnQuyJPPT/<代码>,如果它只出现在map和<代码> iNoD</代码> s中,则不是巨大的资源。有时人们使用指针时没有很好的理由。建议稍微修改一下,只在“i”上加上点,然后在“t”上加上叉:“如果没有剩余的
shared\ptr
s引用此分配,析构函数将自动删除内容。”这一点很好。添加了关于您的修改的adnotation。由于OP希望明确地
删除
内容,因此不建议使用
std::shared\u ptr
here@Fureeish还有一个问题。因为我们使用共享指针作为对其他inode的引用,所以我们不必担心递归,因为删除一个目录需要删除其所有共享指针,所以链中的所有其他inode也会自动删除。“因为删除一个目录需要删除其所有共享指针”-否。您不能删除共享指针。您可以销毁对象本身,当且仅当不再有指向前面提到的指针内容的
shared_ptr
s时,才会对内容执行
delete
void directory::remove (const string& filename) {
   DEBUGF ('i', filename);
   dirents.erase(filename); // erasing that object makes it call a delete on content
}