作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我定义了一个名为 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/
我是一名优秀的程序员,十分优秀!