C 物件陣列釋放造成記憶體洩漏

2021-07-15 07:30:33 字數 879 閱讀 2702

物件陣列在釋放的時候,經常會遇到兩種情況,可能會造成記憶體洩漏:

例如,geopoint是乙個類:

class geopoint

; geopoint (double x, double y);

~geopoint(){};

public:

void setx(double x);

void sety(double y);

double getx();

double gety();

private:

double dx;

double dy;

};

第一種情況(可能經常遇到):

geopoint *object = new geopoint[3];

delete object; //錯誤,因為此時釋放掉的只是object[0]的記憶體(編譯器以&object[0]的位址為引數呼叫一次析構函式),

//等同於delete[1] object;

delete object;//正確,或者delete [3]object也行

第二種情況(稍微複雜點):

geopoint **obj = new geopoint *[3];//只是動態的分配了3個obj物件的指標陣列,但它們本身並不是物件

//分配記憶體

for(int i = 0; i < 3; ++i)

delete obj;//錯誤,此時delete只是指標而非其指向的物件。

//要這樣做才正確:

for(int i = 0; i < 3; ++i)

delete obj;

PHP物件遞迴引用造成記憶體洩漏

如果php物件存在遞迴引用,就會出現記憶體洩漏。這個bug在php裡已經存在很久很久了,先讓我們來重現這個bug,如下 class foo class bar for i 0 i 100 i 執行以上 你會發現,記憶體使用量本應該不變才對,可實際上卻是不斷增加,unset沒有完全生效。現在的開發很多...

delete釋放new 造成的洩漏

正常 class ctest private int m value int main return 0 對應的彙編 while 1 對於new,vs2008是在申請記憶體的時候多申請了4個位元組大小的記憶體,用來存放陣列個數,返回給上層使用的是實際位址 4。錯誤的delete class ctes...

ThreadLocal造成的記憶體洩漏

在多執行緒中為了避免執行緒安全問題,常用的一種方式就是引入threadlocal變數,為何這種方式會引發執行緒安全問題呢?首先我們來看一下threadlocal是如何實現儲存執行緒私有變數的原理 threadlocal裡面定義了乙個內部類threadlocalmap static class thr...