2011-02-24 95 views
0

嗨 的只是想知道如果我刪除全局PTR這是否會導致內存泄露刪除全局PTR

+1

一個例子會很棒。 – sharptooth 2011-02-24 11:20:20

+1

這是一個非常不尋常的問題。你永遠不應該「刪除一個全局指針」。你應該使用智能指針(或其他形式的容器)來處理你的刪除,這樣你就不必擔心它。 – 2011-02-24 11:55:12

回答

6

沒有,但是如果還有一些其他指向你刪除的對象可導致懸擺指針。內存泄漏是指沒有指向已分配對象的指針,因此刪除指針本身不會導致內存泄漏。

+0

我認爲你的答案可能是「是,最終」:)我認爲這是一個非常好的(雖然很難)的方法來了解實踐中的內存泄漏 – davka 2011-02-24 11:24:19

+0

@davka - 你的意思是通過無用的指針釋放內存泄漏到釋放的內存? – Dennis 2011-02-24 11:27:32

+0

@丹尼斯:不,你說得對,我應該糾正自己。這不會導致內存泄漏,但是當從程序的其他部分訪問它時會導致分段錯誤或內存損壞,如本答案中所述。當然,你可以(也應該)在delete後設置這個指針爲0,但這樣的設計通常很容易出錯 – davka 2011-02-24 11:38:08

0

不,但很容易導致懸掛指針。

如果你的指針是全球性的,應該可能只是堅持圍繞直到執行結束。

0

刪除全局指針不會導致內存泄漏,但可以使指向同一內存的其他指針無效(使其成爲「懸掛」)。

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的軌跡 - 沒有保存其起始地址的變量,因此我們無法釋放它。跟蹤誰和什麼時候改變全局變量是非常困難的,這也是他們應該避免的原因之一。

+0

好的答案,但真的不是內存泄漏是由於指針p的未刪除?你的例子中的 – Dennis 2011-02-24 11:31:06

+0

泄漏的原因不是刪除g_p,而是將p分配給g_p而不刪除g_p。 – mentat 2011-02-24 11:32:12

+0

@ Dennis那麼,關鍵是哪個地址傳遞給刪除操作符,而不是通過哪個指針 - 「delete [] g_p」釋放'foo'中'p'指向的內存。第一行分配的內存仍然未釋放。 – 2011-02-24 11:47:18

0

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

0

沒有實例刪除指針,全局或其他,肯定會導致內存泄漏本身。但是,有幾個例子可能會導致內存泄漏。值得注意的是,調用指向未分配相應的new-expression的指針的delete-expression會導致未定義的行爲(例如,內存泄漏),應始終避免此行爲。

在一些編譯器,

int * p = new int[30]; 

int main() 
{ 
    delete p; // undefined behavior 
} 

刪除表達可能最終僅釋放內存相當於一個INT。由於p指向一個數組,因此應該使用delete[] p;