2017-04-08 22 views
0

たとえば、私はクラスInventoryとクラスItemを持っています。ポインタを削除しますがNULLではありません

class CInventory: 
    CItem* m_pItem; // Member Variable 

CInventory(CItem* pItem) 
    :m_pItem(pItem) 
{} 

// Function 
if(NULL == m_pItem) 
    return; 

先に進むとアイテムが消えてしまいますので、アイテムを削除します。

template<class T> 
static inline void safe_delete(T& rData) 
{ 
if(rData) 
    { 
    delete rData; 
    rData = NULL; 
    } 
} 

ただし、CInventory if(NULL == pItem)の機能は機能しません。 私はそれらがすべて同じポインタを持っていることを知りました。

私のコードで何が問題になっていますか?

+6

のラインに沿っています。 [最小、完全で検証可能な例](https://stackoverflow.com/help/mcve)で更新を歓迎します。 –

+2

その関数が特定の 'CItem'へのすべてのポインタを変更することを期待していますか?それは渡すポインタを変更するだけです。 (そしてnullポインタを 'delete 'することは安全です;あなたはそのチェックを取り除くことができます) – molbdnilo

+1

その関数の名前を' safe_delete'から 'sort_of_safe_delete'に変更することを検討してください。 'CInventory * p1 =新しいCInventory; Cインベントリ* p2 = p1; safe_delete(p1); '' p2'は解放されたメモリを指すようになりました。ぶら下がっているポインタへの解決策は、低レベルのハックではなく**デザイン**です。 –

答えて

1

あなたのsafe_deleteは、与えられたポインタのために割り当てられたメモリを削除する仕事をしているようですが(nullに設定します)、これは同じメモリを指す他のポインタを無効にしません。あなたが望む何

int main() 
    { 
    int* pA = new int(); // let's say pA = 0x4420ffbe 
    int* pB = pA; // pB = pA = 0x4420ffbe 

    // equivalent to safe_delete 
    delete pA; 
    pA = nullptr; // pA = 0x00000000 

    // pB still points to 0x4420ffbe 


    return 0; 
    } 

は、あなたが投稿したコードが不完全なようだunique_ptrshared_ptrまたはweak_ptr

関連する問題