2017-10-21 13 views
1

C++でリンクリストのノードを削除しようとしていますが、トランザクションを削除した後に_pending_txがnullptrではないと言っています。私も把握することはできませんメモリリークノードの削除C++

namespace CSE250 { 
struct dTransactionNode;} 

struct CSE250::dTransactionNode { 
Transaction _tx; 

dTransactionNode* _prev; 

dTransactionNode* _next; 

dTransactionNode(size_t time, double amount) : _tx(time, amount), _prev(nullptr), _next(nullptr) { }}; 

:またvalgrindの私は、メモリリークを持っていると私はこれは私が削除しようとしているノードの構造体である

bool BankData::void_transaction(const size_t& customer_id, const size_t& timestamp) { 

bool var8 = false; 

if (transaction_exists(customer_id, timestamp) == true) 
{ 
    int blah3 = customerVector.size(); 
    for (int i = 0; i < blah3; i++) 
    { 
     if (customerVector.at(i)._customer_id == customer_id) 
     { 
      if (customerVector.at(i)._pending_txs != nullptr) 
      { 
       CSE250::dTransactionNode *temp = customerVector.at(i)._pending_txs; 
       while (temp->_tx._timestamp != timestamp) 
       { 
        temp = temp->_next; 
        if ((temp->_next == nullptr) && (temp->_tx._timestamp != timestamp)) 
        { 
         var8 = false; 
        } 
       } 
       if (temp->_tx._timestamp == timestamp) 
       { 
        if ((temp->_prev == nullptr) && (temp->_next == nullptr))   //head and only node 
        { 
         delete customerVector.at(i)._pending_txs; 
         customerVector.at(i)._pending_txs = nullptr; //after i delete the head and only node i reset it to a nullptr 
         var8 = true; 
        } 
        else if ((temp->_prev == nullptr) && (temp->_next != nullptr))  //head 
        { 
         temp = customerVector.at(i)._pending_txs->_next; 
         delete customerVector.at(i)._pending_txs; 
         customerVector.at(i)._pending_txs = temp; 
         customerVector.at(i)._pending_txs->_prev = nullptr; 
         var8 = true; 
        } 
        else if ((temp->_prev != nullptr) && (temp->_next == nullptr)) //tail 
        { 
         temp = customerVector.at(i)._pending_txs->_prev; 
         delete customerVector.at(i)._pending_txs; 
         customerVector.at(i)._pending_txs = temp; 
         customerVector.at(i)._pending_txs->_next = nullptr; 
         var8 = true; 
        } 
        else                //middle node 
        { 
         temp = customerVector.at(i)._pending_txs->_next; 
         customerVector.at(i)._pending_txs->_next->_prev = customerVector.at(i)._pending_txs->_prev; 
         delete customerVector.at(i)._pending_txs; 
         customerVector.at(i)._pending_txs = temp; 
         //temp->_prev->_next = temp->_next; 
         //temp->_next->_prev = temp->_prev; 
         //temp = nullptr; 
         //delete temp; 
         var8 = true; 
        } 
       } 
      } 
     } 
    } 
} 
return var8; 

それを把握することはできませんと言いますなぜ私はそれを削除しようとすると、タイムスタンプと金額ではなく、タイムスタンプだけが削除されます。トランザクションが存在する関数を実行すると、依然としてトランザクションの一部が存在することになります。あなたがdelete何か、ポインタが自動的にnullptrに設定されていない

That's the valgrind message

And those are the error messages I get that say its not pointing to a nullptr after the transaction has been voided even thoguh i set it manually to a null ptr

+0

deleteはnullポインタを何も設定しません。 –

+1

適切なスマートポインタを使用します。 –

+0

そうですか temp = customerVector.at(i)._ pending_txs; customerVector.at(i)._ pending_txs = nullptr; delete temp: ? –

答えて

1

。これを行うのはプログラマの義務です。 Why doesn't delete set the pointer to NULL?

ポインタをnullに設定すると、メモリは削除されません。もしそうなら、deleteに電話する前に、それを参照する別のポインタでメモリを削除しないと、メモリリークが発生します。

スマートポインタを使用することができますが、それはあなたのためのトリックです。

+0

そうですね、2行目はそれを気にしませんか? delete customerVector.at(i)._ pending_txs; customerVector.at(i)._ pending_txs = nullptr; //頭を削除した後、ノードだけをnullptrにリセットした後 var8 = true; –

+0

はい@マチューキルシャー。 – gsamaras

+0

それは私がやったことだし、私はまだメモリリークを受ける –

関連する問題