物件陣列在釋放的時候,經常會遇到兩種情況,可能會造成記憶體洩漏:
例如,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...