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

zep*_*hyr 0 c++ garbage-collection

我还在学习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);
};
Run Code Online (Sandbox Code Playgroud)

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

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

1)我是否必须担心删除这些新对象或c ++知道自己删除它们?

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

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

谢谢!

das*_*ght 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;
};
Run Code Online (Sandbox Code Playgroud)

这样您就可以按照描述的方式链接调用:

vec = vec.scale(5).rotate(45);
Run Code Online (Sandbox Code Playgroud)

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