C++ 中未分配对象的垃圾回收

Garbage Collection in c++ for unassigned objects

本文关键字:对象 分配 C++      更新时间:2023-10-16

我仍在学习 c++ 的所有细节,我有一个关于它如何处理与我正在执行的特定任务相关的垃圾收集的具体问题。我有一些类,Vector2D,它包含矢量的坐标以及可以对矢量执行的一组数学属性(点积,旋转,缩放等(。下面列出了一个提供布局的示例头文件。

#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(不能完成但需要完成,那么我的代码构建是否是一种不好的做法?我应该把它改成不做我做过的事情吗?

谢谢!

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,并销毁在该过程中创建的两个临时对象。

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

由于碎片问题,避免了动态内存分配。

垃圾收集在安全关键或时间关键事件上不受欢迎。