2017-04-08 68 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」的指針?它只會修改你傳遞給它的指針。 (並且刪除一個空指針是安全的,你可以刪除這個檢查。) – molbdnilo

+1

考慮把那個函數的名字從'safe_delete'改成'sort_of_safe_delete'。 'CInventory * p1 = new CInventory; CInventory * p2 = p1; safe_delete(p1);''p2'現在指向釋放內存。懸空指針的解決方案是**設計**,而不是低級別的黑客。 –

回答

1

您的safe_delete似乎完成了爲給定指針刪除已分配內存的工作(並將其設置爲空),但這並不會使指向相同內存的任何OTHER指針無效(現在無論如何都是垃圾) 。

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_ptrweak_ptr