c ++中用于未分配对象的垃圾收集

时间:2014-12-04 18:31:29

标签: c++ garbage-collection

我还在学习c ++的所有细节,我对如何根据我正在做的特定任务处理垃圾收集有一个具体的问题。我有一些类,Vector2D包含一个矢量的坐标,以及一组可以对矢量做的数学属性(点积,旋转,缩放等)。下面给出了一个给出布局的示例头文件。 / p>

#ifndef VECTOR2D_H
#define VECTOR2D_H

class Vector2D{
private:
    double x, y;

public:    
    Vector2D(double var1, double var2, int coordinateType);
    Vector2D *  normalize();
    Vector2D *  rotate(double angle);
    Vector2D *  scale(double value);
};

现在,我以特定的方式创建了这个类,以获得特定的功能。当我有一个Vector2D对象,比如vec时,我希望能够操作该对象并获取一个新对象,而不是更改vec对象。我也想要链接命令的能力。这样我可以执行缩放vec之类的操作,然后使用命令vec = vec.scale(5).rotate(45)旋转它。由于这个原因,这些方法中的每一种都只返回一个新的Vector2D对象,而不是更改vec的参数。

我的问题来自垃圾收集。我只是不知道c ++如何处理这个以及我应该如何处理它。从技术上讲,在vec.scale(5)的过程中创建了一个新的Vector2D对象,然后我开始.rotate(45),但之后再也不用了。更重要的是,我甚至无法访问新创建的对象,因为我从未将其分配给任何东西。所以我的问题是这个。

1)我是否需要担心删除这些新对象,或者c ++是否知道要自行删除它们?

2)如果我必须删除它,如何在不引用该对象的情况下这样做?

3)如果(2)不能完成但需要完成,我的代码构造是不好的做法?我应该改变它不做我做过的事吗?

谢谢!

2 个答案:

答案 0 :(得分:6)

C ++没有垃圾收集。每当使用operator newoperator new[]创建对象时,您都有责任使用deletedelete[]删除这些对象,具体取决于对象的创建方式。

C ++允许您使用一旦超出范围就会被销毁的临时对象。这允许您实现您正在寻找的API:您需要做的就是声明您的成员函数返回类型而不指针,标记您的函数const,并返回对象而不是指针:

class Vector2D {
private:
    double x, y;

public:    
    Vector2D(double var1, double var2, int coordinateType);
    Vector2D  normalize() const;
    Vector2D  rotate(double angle) const;
    Vector2D  scale(double value) const;
};

通过这种方式,您可以按照描述的方式链接调用:

vec = vec.scale(5).rotate(45);

这将为返回值scale(5)创建一个临时对象,在其上调用rotate(45),将结果分配回vec,并销毁在此过程中创建的两个临时对象

答案 1 :(得分:1)

在内存受限系统(也就是嵌入式系统)中,我们使用预先分配的对象数组作为内存池并从内存池中进行分配。

由于存在碎片问题,因此可以避免动态内存分配。

垃圾收集不赞成安全关键或时间紧急事件。