2017-04-08 67 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