我还在学习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)不能完成但需要完成,我的代码构造是不好的做法?我应该改变它不做我做过的事吗?
谢谢!
答案 0 :(得分:6)
C ++没有垃圾收集。每当使用operator new
和operator new[]
创建对象时,您都有责任使用delete
或delete[]
删除这些对象,具体取决于对象的创建方式。
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)
在内存受限系统(也就是嵌入式系统)中,我们使用预先分配的对象数组作为内存池并从内存池中进行分配。
由于存在碎片问题,因此可以避免动态内存分配。
垃圾收集不赞成安全关键或时间紧急事件。