0

という名前のフィールドが 1 つだけある 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;
  }
}

私のデストラクタが呼び出されると、すべての内部マップの割り当てが正しく解除されるようです (それぞれに対して「メンバーを削除しています...」と出力されます)。ただし、それが完了すると、「1068 バイトの "munmap" に失敗しました: 引数が無効です」という実行時エラーが発生します。何が原因ですか?

「3 のルール」について簡単に説明しましたが、なぜコピー コンストラクターや代入演算子が必要なのか、それによって問題がどのように解決されるのかがわかりません。どちらも直接使用する必要はありません。

4

1 に答える 1