ベクターに割り当てたメモリを削除しようとして問題が発生しました。list.clear()を呼び出しても、メモリの割り当てが解除されません。
だから私はSetと呼ばれるテンプレートベースのクラスにこのようなコードを持っています
template <class T>
class Set {
public:
// stuff
private:
int size;
std::vector<T> list;
};
そしてコンストラクターでは、ベクターにメモリーを割り当てました。だから私はlist=new std::vector;と呼びます。
あなたの興味のために、これが私のコピーコンストラクターと代入演算子です。これは私がベクトルにメモリを割り当てる場所でも見たものです。
template <class T>
Set<T>::Set(const Set& aSet)
{
size = aSet.size;
list->clear();
list = new vector<T>;
for (int i = 0; i < size; ++i) {
list[i] = aSet.list[i];
}
}
template <class T>
Set<T>& Set<T>::operator=(const Set& right)
{
if (this != &right) {
list->clear();
size = right.size;
list = new vector<T>;
for (int i = 0; i < size; ++i) {
list[i] = right.list[i];
}
}
return (*this);
}
デストラクタには、すべての要素を削除してからメモリの割り当てを解除するlist.clear()があります。
しかし、問題は、.outファイルでvalgrindを実行すると、メモリが確実に失われたことを示しており、なぜこれを示しているのかわかりません。Stackoverflowでいくつかの質問を読みましたが、基本的にすべてを試しました。clear()を試し、ベクターを削除しましたが、うまくいきませんでした。次に、erase(list.begin()、list.end())を試みましたが、それも機能しませんでした。
私の思考プロセスは、Set * aSet =newSet;を使用しているというものです。私のメインクラスでは、intはオブジェクトではないため、list.clear()を呼び出しても解放されません。これは正しいですか?メモリを正しく削除するにはどうすればよいですか?
助けてくれてありがとう。
Edit1=リスト*をsetListに変更
私の新しいコンストラクターと代入演算子:
template <class T>
Set<T>::Set(const Set& aSet)
{
size = aSet.size;
setList.clear();
setList = aSet.setList;
}
template <class T>
Set<T>& Set<T>::operator=(const Set& right)
{
if (this != &right) {
setList.clear();
size = right.size;
setList = right.setList;
}
return (*this);
}
Valgrindは、私が同じ量の失われたメモリを持っているとまだ報告しています。私のデストラクタにはまだlist.clear()があります
Valgrindログ:
==11398==
==11398== HEAP SUMMARY:
==11398== in use at exit: 62,969 bytes in 352 blocks
==11398== total heap usage: 540 allocs, 188 frees, 68,046 bytes allocated
==11398==
==11398== LEAK SUMMARY:
==11398== definitely lost: 8,624 bytes in 14 blocks
==11398== indirectly lost: 1,168 bytes in 5 blocks
==11398== possibly lost: 4,829 bytes in 56 blocks
==11398== still reachable: 48,348 bytes in 277 blocks
==11398== suppressed: 0 bytes in 0 blocks
==11398== Rerun with --leak-check=full to see details of leaked memory