2013-11-28 22 views
1

當一個類的構造函數在堆上,例如分配內存堆棧展開動態創建的對象,其構造也作用在堆

class bla 
{ 
    private: 
     double *data; 
     int size; 

    public: 
     bla(int s) 
     { 
      size = s; 
      data = new double [size]; 
     } 
     ~bla() 
     { 
      delete[] data; 
     } 
} 

我有一個功能,例如,

void f(bool huge) 
{ 
    bla *ptr; 
    if (huge) 
     ptr = new bla(1e10); 
    else 
     ptr = new bla(1e2); 

    //... 

    delete ptr; 
} 

如果ptr = new bla(1e10)分配是SUCESSFUL(這意味着,datasize分配),但不構造會發生什麼 - >他拋出異常,因爲1E10是大?我有data = new double [size]沒有內存泄漏,但我仍然存在堆上double *dataint size內存泄漏?或者它們是通過堆棧解除清理的?

我應該寫它這種方式更好?:

void f(bool huge) 
{ 
    bla *ptr = 0; 
    try { ptr = new bla(1e10); } 
    catch (...) { delete ptr; throw; } 
} 

class bla 
{ 
    private: 
     double *data = 0; 
     // ... to not have an delete[] on a non-0 pointer 
} 

編輯

有點更精細的例子來說明templatetypedefs anwswer:

#include <iostream> 

using namespace std; 

class bla2 
{ 
private: 
    double *data; 

public: 
    bla2() 
    { 
     cout << "inside bla2 constructor, enter to continue"; 
     cin.get(); 
     data = new double [2*256*256*256]; 
    } 
    ~bla2() 
    { 
     cout << "inside bla2 destructor, enter to continue"; 
     cin.get(); 
     delete[] data; 
    } 
}; 

class bla 
{ 
private: 
    bla2 data1; 
    double data2[2*256*256*256]; 
    double *data3; 

public: 
    bla() 
    { 
     cout << "inside bla constructor, enter to continue"; 
     cin.get(); 
     data3 = new double [8*256*256*256]; // when only 1/4 as much -> then all success 
    } 
    ~bla() 
    { 
     cout << "inside bla destructor, enter to continue"; 
     cin.get(); 
     delete[] data3; 
    } 
}; 

void main() 
{ 
    bla *a; 
    cout << "program start, enter to continue"; 
    cin.get(); 
    try { a = new bla; } 
    catch (...) { cout << "inside catch, enter to continue"; cin.get(); exit(EXIT_FAILURE); } 
    cout << "success on a, enter to continue"; 
    cin.get(); 
    delete a; 
} 

白衣這個例子中,我可以在我的機器(Win7的4GB RAM)有關的ressource顯示器,合得來看看怎麼回事第一內側bla2()然後bla()但後來因爲沒有~bla()因爲失敗分配data3首先調用~bla2(),然後結束(的)在catch(...)內存在基線上,就像程序啓動時一樣。

當我設置DATA3元素的數量只有1/4之多,那麼所有succedes,與構造函數和析構函數的調用預期的順序。

回答