嗨 的只是想知道如果我刪除全局PTR這是否會導致內存泄露刪除全局PTR
刪除全局PTR
回答
沒有,但是如果還有一些其他指向你刪除的對象可導致懸擺指針。內存泄漏是指沒有指向已分配對象的指針,因此刪除指針本身不會導致內存泄漏。
不,但很容易導致懸掛指針。
如果你的指針是全球性的,應該可能只是堅持圍繞直到執行結束。
刪除全局指針不會導致內存泄漏,但可以使指向同一內存的其他指針無效(使其成爲「懸掛」)。
char* g_p = new char[10];
void foo()
{
delete[] g_p;
g_p = 0;
}
int main()
{
char* p = g_p;
foo();
// p still points to memory that has been deallocated
char ch = *p; // using dangling pointer - undefined behaviour
return 0;
}
我(不正確)例如編輯之前(我已經離開這麼評論張貼意義):
的一個典型案例,當刪除全局指針可能會導致內存泄漏:
char* g_p = new char[10]; // allocate memory block 1
void foo()
{
char* p = new char[10]; // allocate memory block 2
g_p = p;
}
int main()
{
foo();
delete[] g_p; // free memory block 2
return 0;
// memory leak: memory block 1 has not been deallocated
}
全局指針已在foo
中被賦值爲另一個值,因此我們丟失了內存塊1的軌跡 - 沒有保存其起始地址的變量,因此我們無法釋放它。跟蹤誰和什麼時候改變全局變量是非常困難的,這也是他們應該避免的原因之一。
delete
-int全局指針值不會導致內存泄漏,但可能會導致生成別名懸掛指針。
想象
int * ptr;
int main()
{
ptr = new int;
int * alias = ptr;
delete ptr;
*alias = 5; // Undefined Behaviour
return 0;
}
現在使用這種存儲位置會導致不確定的行爲。 當兩個指針指向相同的位置時,這種情況被稱爲Aliased Pointer
應該更好地設計您的系統,並嘗試不使用全局變量。但是,即使在本地的功能體內,同樣的問題仍然存在。
此外,應該注意的是,ptr
當你的程序開始執行時被自動初始化爲0
(存儲類的原因),所以如果你嘗試做一個delete ptr
在你的程序沒有什麼大不了的事情的第一行(是的,全局變量在執行main()
開始之前被初始化)。
有一個莫名其妙也許有關後1-2天前,我認爲(因爲它是C++
),你會覺得很有趣,樂於助人。以a look
沒有實例刪除指針,全局或其他,肯定會導致內存泄漏本身。但是,有幾個例子可能會導致內存泄漏。值得注意的是,調用指向未分配相應的new-expression的指針的delete-expression會導致未定義的行爲(例如,內存泄漏),應始終避免此行爲。
在一些編譯器,
int * p = new int[30];
int main()
{
delete p; // undefined behavior
}
刪除表達可能最終僅釋放內存相當於一個INT。由於p指向一個數組,因此應該使用delete[] p;
。
- 1. ptr = free(ptr),NULL安全嗎?
- 2. 刪除全局變量nodejs
- 3. 全局「放置」刪除[]
- 4. 刪除全局註冊JsonConverter
- 5. 如何刪除全局變量字典?
- 6. 從功能中刪除全局
- 7. 全局臨時表刪除操作
- 8. Stata - 全局宏何時被刪除?
- 9. 實體框架:全局禁用刪除
- 10. 無法刪除全局程序包
- 11. 忽略全局重寫新/刪除
- 12. 形式_self刪除全局變量
- 13. 從超全局刪除陣列($ _GET,$ _ POST ...)
- 14. Kohana全局清除?
- 15. 是否可以從全局註冊表中全局刪除vue組件?
- 16. 調用我的全局操作符刪除操作通過刪除操作符
- 17. 差異,* PTR和&PTR
- 18. 魚殼:全部刪除除
- 19. Teradata全部刪除與刪除+創建
- 20. 刪除全部Facebook
- 21. 全部刪除(和)
- 22. 完全刪除Jupyter
- 23. nHibernate安全刪除
- 24. 完全刪除Javascript
- 25. 完全刪除Heroku
- 26. 完全刪除AdView
- 27. Linq全部刪除
- 28. 刪除ptr解決了訪問衝突異常寫入0
- 29. 從虛擬成員函數ptr中刪除類型(bug?)
- 30. 數據突然從Boost shared_array/ptr中刪除
一個例子會很棒。 – sharptooth 2011-02-24 11:20:20
這是一個非常不尋常的問題。你永遠不應該「刪除一個全局指針」。你應該使用智能指針(或其他形式的容器)來處理你的刪除,這樣你就不必擔心它。 – 2011-02-24 11:55:12