3

リストを使用してStacksクラスを作成し、2つのStacksを使用してQueueクラスを作成する割り当てがあります。割り当てを完了しましたが、valgrindを実行すると、次のコードでメモリリークが発生していることがわかります。

T Stack<T>::pop()
{
    T *n = new T;
    *n = myStack.front();
    myStack.pop_front();
    return *n;
}

ポインタを返した後、ポインタを削除できないので、修正方法がわかりません。前もって感謝します。

4

7 に答える 7

4

なぜ new を使う必要があるのですか?次のように、スタックのトップ値のコピーを作成できます。

T Stack<T>::pop()
{
    T n = myStack.front();
    myStack.pop_front();
    return n;
}

したがって、割り当てもリークもありません。

于 2012-10-12T06:26:40.130 に答える
3

コピーを作成し、pop_front 内にある場合はメモリをクリアします。

    T Stack<T>::pop()
    {
        T ret = myStack.front();
        myStack.pop_front();        
        return ret;
    }
于 2012-10-12T06:25:08.670 に答える
0

T *n = new T; you are creating T using new and not using it. that is the problem.

于 2012-10-12T07:00:37.163 に答える
0

あなたの場所では、生のポインターの使用をやめ、shared_ptr に変更します。はるかに安全です。

于 2012-10-12T06:37:52.457 に答える
0

むしろ使うべきだった

T n = myStack.front();
于 2012-10-12T06:25:06.450 に答える
0

正しいコードを提供する複数の回答がありますが、既存のコードが間違っていた理由は次のようになります。

T Stack<T>::pop()
{
    T *n = new T;          // allocates dynamic memory
    *n = myStack.front();  // reference to T from front() copied to allocated T object
    myStack.pop_front();   // removes the T in the stack
    return *n;  // copies your allocated T object to the return value
    // your pointer variable goes out of scope, that address is stored nowhere,
    // this is where the leak occurs...
} 
于 2012-10-12T06:45:10.280 に答える