c++ - 把一个指向数组的指针delete[]之后,赋值成为指向另一个更长的数组,然后delete[] 这个指针,是否会造成内存泄漏
ringa_lee
ringa_lee 2017-04-17 14:24:22
0
3
634
int _tmain(int argc, _TCHAR* argv[])
{
    int* p = new int[3]{1, 2, 3};
    int* k = new int[4]{6, 7, 8, 9};

    delete[] p;
    p = k;
    delete[] p;//此处是否会造成内存泄漏?

    return 0;
}

意思就是说,p初始化时指向的是一个长度为3的数组,而p后来指向了k,那么此时再delete[] p的话,是释放3个单位空间还是4个单位空间?假如只释放3个单位,那就内存泄漏了。
或者换一种说法: delete[] 总要知道需要释放的长度吧。这个长度信息,是跟指针p绑在一起的还是和指针指向的这片地址空间绑在一起的?
如果我是语言设计者的话,我会选择后者,不知我想的对不对。

ringa_lee
ringa_lee

ringa_lee

全部回覆(3)
洪涛

不會,new和delete是處理堆上的內存,堆的管理方式通常會在申請的內存前面加一些關於這塊內存的信息,比如長度之類的,所以你new的時候必須指定一個長度,而delete的時候就不需要了,只需要指明是單一還是陣列。

Peter_Zhu

不會的,具體長度等訊息,以及其和指標的關聯,都是交由編譯器和作業系統完成的,程式設計師無須關心底層實現。

Peter_Zhu

不會造成記憶體洩漏。
p初始化指向一個長度為3的數組,然後再指向長度為4的數組。因為你之前有過一次delete操作,所以不會造成記憶體的洩漏。這裡聲明的指標p是存放在堆疊上的,而new出來的是存放在堆裡面的,p裡面儲存的是你宣告的陣列的位址,p裡面的位址就是你在堆上申請的陣列的位址,需要你用delete釋放的,不釋放會造成記憶體洩漏。
delete不需要知道陣列的特定長度,只需要根據是否是陣列而選擇delete或是delete[]就行了。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板