4

我想确保我正在正确地创建/销毁这个对象......

这是我的 Camera 对象的定义,其中包含对 Vector 对象的引用:

#ifndef CAMERA_H
#define CAMERA_H

#include "vector.h"

class Camera {
 private:
  Vector* location;
  Vector* direction;
  float velocity;
 public:
  Camera();
  ~Camera();
};

#endif

在构造函数中创建:

#include "camera.h"

Camera::Camera() {
  location = new Vector(1.0, 1.0, 1.0);
  direction = new Vector(1.0, 1.0, 1.0);
  velocity = 0.0;
}

Camera::~Camera() {
  delete location;
  delete direction;
}

然后,每当我想要一个相机对象时,我只需调用Camera camera.

  • 我是否正确假设当变量camera超出范围时,将调用析构函数并且我不会遭受任何内存泄漏?

  • 如果我想camera在范围关闭之前删除变量,执行是否正确delete camera

4

3 回答 3

2

是和是(提供Camera是通过调用创建的new)。
但是你也需要遵循三法则

此外,重新考虑是否真的需要动态分配的成员是个好主意?
请记住,通过将原始指针与动态内存一起使用,您将负责为您的类显式执行内存管理,这很容易出错。您最好只使用实例而不是指针:

  Vector location;
  Vector direction;

如果您必须至少使用指针,请使用智能指针而不是原始指针成员。

于 2013-01-20T07:10:44.047 回答
2

我是否正确假设当可变相机超出范围时,将调用析构函数并且我不会遭受任何内存泄漏?

是的

如果我想在范围关闭之前删除可变相机,执行删除相机是否正确?

不,相机不是由new运营商分配的,你不能删除它,直到它超出范围。除非调用new/delete强制对象持续时间。

潜在的内存泄漏:

在下面的代码中,有可能泄漏内存。如果构造location完成但direction = new Vector(1.0, 1.0, 1.0);失败并抛出异常,则不会调用 Camera 析构函数,从而导致location内存泄漏。

Camera::Camera() {
  location = new Vector(1.0, 1.0, 1.0);
  direction = new Vector(1.0, 1.0, 1.0);
  velocity = 0.0;
}

更好的解决方案: 不需要为 Vector 成员引入指针。应首选使用自动存储。

class Camera {
 private:
  Vector location;
  Vector direction;
  float velocity;

 public:
  Camera() 
  : location(1.0, 1.0, 1.0), 
    direction(1.0, 1.0, 1.0),
    velocity(0.0f)
  {
  }
};
于 2013-01-20T07:14:26.447 回答
1

要回答您的直接问题,是的,析构函数将被触发,是的,您的内存将被清理。但是您没有为不正确的复制、分配此对象类型和虚拟破坏提供保护,这可能会导致严重的问题。更多关于这方面的细节可以通过阅读三法则和关于 SO 主题的许多文章来找到。

除非您需要动态分配(而且您可能不需要),否则请改为:

class Camera 
{
private:
    Vector location;
    Vector direction;
    float velocity;
public:
    Camera();
};

Camera::Camera() 
    : location(1.0, 1.0, 1.0)
    , direction(1.0, 1.0, 1.0)
    , velocity(0.0)
{
}

不需要析构函数。

于 2013-01-20T07:14:52.777 回答