割り当ての場合I は、カスタムリストである必要があります。タイトルとして、nodes \ itemsのdeleteを呼び出していてもメモリリークが発生します。私はこれについて何か助けていただければ幸いです。 valgrindのカスタムリンクリストのメモリリークC++
==12125== 40 (24 direct, 16 indirect) bytes in 1 blocks are definitely lost in loss record 3 of 3
==12125== at 0x4C29203: operator new(unsigned long) (vg_replace_malloc.c:334)
==12125== by 0x400FD8: DLinkList<Foo*>::push_back(Foo*) (DLinkList.hpp:138)
==12125== by 0x400CF3: main (Source.cpp:28)
から
リストソース
template <typename T>
class DLinkList
{
private:
struct Node
{
T data;
Node *nextNode;
Node *prevNode;
Node(T data, Node *nextNode = nullptr, Node *prevNode = nullptr)
{
this->data = data;
this->nextNode = nextNode;
this->prevNode = prevNode;
}
~Node() { delete data; }
};
Node *head;
Node *tail;
public:
DLinkList();
~DLinkList();
void push_back(T data);
};
template <typename T>
inline void DLinkList<T>::push_back(T data)
{
if (isEmpty())
{
head = new Node(data);
tail = head;
}
else
{
tail->nextNode = new Node(data, nullptr, tail);
tail = tail->nextNode;
}
}
template <typename T>
DLinkList<T>::DLinkList()
{
head = nullptr;
tail = nullptr;
}
template <typename T>
DLinkList<T>::~DLinkList()
{
Node *ptr = head;
while (ptr->nextNode != nullptr)
{
Node *garbage = ptr;
ptr = ptr->nextNode;
delete garbage;
}
}
のFooクラスとメイン
class Foo
{
public:
Foo() { i = 0; d = 0.0; }
Foo(int i, double d) { this->i = i; this->d = d; }
int getInteger() { return i; }
double getDouble() { return d; }
private:
int i;
double d;
};
int main()
{
DLinkList<Foo*> f1;
f1.push_back(new Foo());
f1.push_back(new Foo(2, 5.5));
cout << "1st Values: " << f1.at(0)->getInteger() << ", " << f1.at(0)->getDouble() << endl;
cout << "2nd Values: " << f1.at(1)->getInteger() << ", " << f1.at(1)->getDouble() << endl;
return 0;
}
私はそれを言いたい、メモリはここで失われているかどうかはわかりませんよそれはそれをコピーしており、元のものが失われているからです。この場合、私はそれをどのように扱うのかよくわかりません。
もう一度ご理解いただきありがとうございます。私は関連するすべての質問を調べようとしましたが、これをカバーするものは見当たりませんでした。少なくとも私はそれを理解しませんでした。ありがとうございました!
f1.push_back(new Foo());
f1.push_back(new Foo(2, 5.5));
あなたがそれらにここにインスタントメモリリークを作成している。他の問題は、このような明示的DLinkList
デストラクタを呼び出すの誤った使い方をするようなコメントで指摘し、あなたがmain()
でこれをやっている考える
私の推測では、あなたは 'T'にどのようなタイプを使用しているかによって異なります。おそらく 'Node'のデストラクタが役に立ちます。 – klutt
私はそれを試しました。データの削除と呼ばれ、valgrindは4つのallocs、4つの解放を示します - しかし、私はまだ同じメッセージで漏れがあります。 –
@MasonR 'f1。〜DLinkList();' - なぜあなたはこれをやっていますか?オブジェクトのデストラクタは、オブジェクトがスコープから外れると自動的に呼び出されます。あなたがここでやっているのは、C++デストラクタの動作を妨害することによってメモリ破壊を引き起こすことだけです。その行を取り除き、正しいコピーセマンティクスを持つようにクラスを修正してください(あなたのプログラムは 'DLinkList'を別の' DLInkList'に割り当てるだけで簡単に破壊されます)。 – PaulMcKenzie