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(這意味着,data
和size
分配),但不的構造會發生什麼 - >他拋出異常,因爲1E10是大?我有data = new double [size]
沒有內存泄漏,但我仍然存在堆上double *data
和int 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,與構造函數和析構函數的調用預期的順序。