gpt4 book ai didi

C++ 析构函数运行时错误 : failed to munmap

转载 作者:行者123 更新时间:2023-11-28 07:28:52 26 4
gpt4 key购买 nike

我定义了一个名为 ClusterSet 的类,它只有一个字段,名为 clusters:

class ClusterSet {
std::map<std::string, std::map<std::string, float>* > clusters;

public:
typedef std::map<std::string, std::map<std::string, float> *>::iterator iterator;
typedef std::map<std::string, std::map<std::string, float> *>::const_iterator const_iterator;

iterator begin() { return clusters.begin(); }
const_iterator begin() const { return clusters.begin(); }
iterator end() { return clusters.end(); }
const_iterator end() const { return clusters.end(); }

void create_cluster(std::string representative);
void add_member(std::string representative, std::string member, float similarity);
int write_to_file(std::string outputfile);
int size();
~ClusterSet();
};

在我的create_cluster 方法中,我使用new 为内部映射分配内存,并将该指针存储在clusters 中。我定义了一个析构函数,以便我可以释放所有这些内存:

ClusterSet::~ClusterSet() {
ClusterSet::iterator clust_it;
for (clust_it = clusters.begin(); clust_it != clusters.end(); ++clust_it) {
std::cout << "Deleting members for " << clust_it->first << std::endl;
delete clust_it->second;
}
}

当我的析构函数被调用时,它似乎正确地解除了所有内部映射的分配(它为每个映射打印出“Deleting members for...”)。但是,一旦完成,我就会收到一个运行时错误,提示“无法“munmap”1068 字节:无效参数”。这是什么原因造成的?

我已经简要地了解了“三规则”,但我不明白为什么我需要复制构造函数或赋值运算符,或者它们如何解决我的问题。我永远不需要直接使用任何一个。

最佳答案

动态分配内部映射没有充分的理由(而且有很多缺点)。将外部 map 类型更改为

std::map<std::string, std::map<std::string, float> >

然后您根本不需要实现自己的析构函数和复制/移动语义(除非您想更改从映射中获得的那些,也许是为了防止复制您的类)。

如果在其他情况下,您确实需要存储指向对象的指针并且将它们的生命周期与其在 map 中的存在联系起来,存储智能指针:

std::map<std::string, std::unique_ptr<something> >

如果出于某种原因你真的想手动管理它们的生命周期,那么你将需要遵循三法则并为你的类提供有效的复制语义(通过删除复制构造函数/赋值运算符来防止复制,或者实现任何你想要的语义)。即使您不认为自己在复制对象,也很容易编写复制对象的代码。

关于C++ 析构函数运行时错误 : failed to munmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18132816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com