释放内存(如果可能)

时间:2013-05-16 05:10:47

标签: c++

我可以释放用于分配对象的内存吗?如果是这样,我该怎么办?

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
    }

它们具有相同的输出,那么使用动态内存分配的优势是什么?

3 个答案:

答案 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 () {
}