2015-02-11 78 views
4

我做了一個動態的對象數組。當我調用delete []時,程序崩潰並停止響應。但它確實奇怪:調用所有析構函數和崩潰。看看這個代碼並輸出。所有數組的所有內存都被分配。C++ delete []對象導致崩潰

//main file 
#include "myobject.h" 

int size; 
myObject *foo; 

//some operations to estimate size 

foo = new myObject[size]; 

//some operations with myObject 

std::cout<<"size: "<<size<<"\n"; 
std::cout<<"Deleting object\n"; 

size=0; 
delete [] foo; 

下一個文件:

//myobject.h 

class myObject 
{ 
    public: 
    int number; 

    Object1 ob1[64] 
    Object2 *ob2; 

    myObject(){ }; 
    ~myObject() 
    { 
     std::cout<<"delete "<<number<<"\n"; 

     delete [] ob1; 
     delete [] ob2; 
    }; 
} 

和輸出:

size: 11 

Deleting object 

delete 10 

delete 9 

delete 8 

delete 7 

delete 6 

delete 5 

delete 4 

delete 3 

delete 2 

delete 1 

delete 0 

然後它崩潰並停止響應。

+0

如何分配'ob2'? – 2015-02-11 16:36:52

+3

爲什麼要刪除析構函數中的ob1? – LeeNeverGup 2015-02-11 16:37:06

回答

7

您只能致電delete[]new[]返回的指針,並且您必須完成一次。這同樣適用於deletenew

特別是,您不能delete[] obj1,因爲它是一個內置數組,而不是指針,並且只有指向分配了new[]的未釋放內存,才能使用obj2

6
delete [] ob1; 

你沒有new obj1;它是包含在對象中的數組。刪除沒有用new分配的東西會導致未定義的行爲,這很可能是崩潰。

如果你打算像這樣玩弄指針,那麼你需要了解Rule of Three以避免下一次遇到的死亡陷阱。然後瞭解RAII and smart pointers,忘記這個危險的廢話。