gpt4 book ai didi

c++ - C++中未分配对象的垃圾收集

转载 作者:太空宇宙 更新时间:2023-11-04 15:17:55 26 4
gpt4 key购买 nike

我仍在学习 c++ 的所有来龙去脉,我有一个具体问题是它如何处理与我正在执行的特定任务相关的垃圾回收。我有一些类 Vector2D,其中包含 vector 的坐标以及可以对 vector 执行的一组数学属性(点积、旋转、缩放等)。下面列出的是给出布局的示例头文件。

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

关于c++ - C++中未分配对象的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27301343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com