私はテンプレートとC++で簡単なキューを書いていますが、私のvalgrindのは私が漏れていますことを言い続け:要素のキューリーク?
==5427== HEAP SUMMARY:
==5427== in use at exit: 72,704 bytes in 1 blocks
==5427== total heap usage: 5 allocs, 4 frees, 72,768 bytes allocated
==5427==
==5427== 72,704 bytes in 1 blocks are still reachable in loss record 1 of 1
==5427== at 0x4C29110: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==5427== by 0x50E366F: ??? (in /usr/lib64/libstdc++.so.6.0.21)
==5427== by 0x400E8E9: call_init.part.0 (in /lib64/ld-2.19.so)
==5427== by 0x400E9D2: _dl_init (in /lib64/ld-2.19.so)
==5427== by 0x40011C9: ??? (in /lib64/ld-2.19.so)
==5427==
==5427== LEAK SUMMARY:
==5427== definitely lost: 0 bytes in 0 blocks
==5427== indirectly lost: 0 bytes in 0 blocks
そして、ここでは私の実装です:
template <typename T> class Queue
{
struct node_t {
T data;
struct node_t* next;
};
node_t* newNode(T data)
{
node_t* n = (node_t*)malloc(sizeof(node_t));
if (n) {
n->data = data;
n->next = NULL;
}
return n;
}
public:
Queue() : m_head(NULL), m_tail(NULL) {}
~Queue(){}
void put(T data)
{
node_t* n = newNode(data);
if (m_tail != NULL) {
m_tail->next = n;
}
m_tail = n;
if (m_head == NULL) {
m_head = n;
}
}
T get()
{
node_t* it = m_head;
if (m_head != NULL) {
m_head = m_head->next;
}
T ret;
if (it != NULL) {
ret = it->data;
free(it);
}
return ret;
}
bool isEmpty()
{
return m_head == NULL;
}
private:
node_t* m_head;
node_t* m_tail;
};
また、私は戻っていますプライベートノードからのデータですが、get関数では、キューが空の場合には初期化されないコピー変数を常に返します。new()を使用してヘッドノードがない場合はポインタまたはNULLを返すほうがよいでしょうプレゼント?
あなたは常に 'malloc()'/'free()'または 'new' /' delete'のいずれかを使用してください。 – SingerOfTheFall
デストラクタを実装するのを忘れてしまった(ヒント:キュー自体が破壊された場合に割り当てられたメモリはどうなるでしょうか) – SingerOfTheFall
私はこれを修正しました。 m_tail要素のデータを探します...おそらく私のアルゴリズムは間違っていますか?すべて頭から引っ張った後、尾にデータがあります。 –