我可以释放用于分配对象的内存吗?如果是这样,我该怎么办?
class CRectangle {
int width, height;
public:
CRectangle (int,int);
~CRectangle ();
int area () {
return (width * height);
}
};
CRectangle::CRectangle (int a, int b) {
width = a;
height = b;
}
CRectangle::~CRectangle () {
// Do something here
}
如果我使用动态内存分配,它将是:
class CRectangle {
int *width, *height;
public:
CRectangle (int,int);
~CRectangle ();
int area () {
return (*width * *height);
}
};
CRectangle::CRectangle (int a, int b) {
width = new int;
height = new int;
*width = a;
*height = b;
}
CRectangle::~CRectangle () {
delete width
delete height
}
它们具有相同的输出,那么使用动态内存分配的优势是什么?
答案 0 :(得分:2)
要回答这个问题,请不要。在对象实例化时,所有成员都会自动分配 。唯一需要担心释放内存的情况是动态分配(因为自动内存超出范围之前无法释放)。以这两个整数为例:
int a; //automatic allocation at point of declaration, will exist until it falls out of scope
int *a = new int; //dynamic allocation, exists until deleted. Falling out of scope without releasing memory can cause a memory leak
现在,如果你动态分配对象 然后,你就可以释放内存,但这是在课堂外完成的。
CRectangle *rect;
rect = new CRectangle; //dynamically allocated
//....
delete rect; //free memory allocated by rect
答案 1 :(得分:1)
在您的特定示例中,两者在技术上都是正确的,并且在析构函数中不需要执行任何操作。
在第二个例子中,绝对没有任何好处,事实上它是WASTING内存,因为内存分配有开销。最小的此类开销是12个字节+分配本身 - 在您的情况下,如果我们假设int
是4个字节(这是常见的,但有其他选择),则总共16个字节。
当对象大小变化时,分配对象是有益的(你的大小总是一个int
)[并且最大大小大于分配内存本身的预期开销]或对象是可选[并且大于分配对象的预期开销]。
想象一下,例如,我们为每个单位的大小让你的CRectangle
拥有一个CCell
对象(例如,它可能是某种游戏中每个单元格的内容)。现在,如果我们还想象一个矩形可以是每边1 x 1到几千的任何大小,我们就不希望在每个维度上做几千个静态二维数组,对吗?所以我们必须动态分配它。出于本讨论的目的,我将分配一大堆width * height
,因为这是我们需要的大小。可以考虑进行2D分配,但这会使代码更复杂。
这就是看起来的样子:
class CRectangle {
int width, height;
CCell* cellArray;
public:
CRectangle (int,int);
~CRectangle ();
int area () {
return (width * height);
}
};
CRectangle::CRectangle (int a, int b) {
width = a;
height = b;
cellArray = new CCell[width * height];
}
CRectangle::~CRectangle () {
delete [] cellArray;
}
答案 2 :(得分:0)
在你设计的课程中,你不需要在析构函数中做任何事情。
这没关系:
CRectangle::~CRectangle () {
}