如何在C ++中将对象存储在另一个对象中?

时间:2013-01-20 07:08:59

标签: c++

我想确保我正确地创建/销毁此对象......

这是我的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

3 个答案:

答案 0 :(得分:2)

是和是(提供的Camera是通过致电new 创建的。) 但您还需要遵循 Rule of Three

另外,如果你真的需要动态分配成员,最好重新考虑一下吗? 请记住,通过使用带有动态内存的原始指针,您将负责明确地为您的类执行内存管理,这很容易出错。您只需使用实例而不是指针就好了:

  Vector location;
  Vector direction;

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

答案 1 :(得分: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)
  {
  }
};

答案 2 :(得分:1)

要回答您的直接问题,是的,析构函数将被解雇,是的,您的记忆将被清除。但是,您没有为不正确的复制,分配此对象类型和虚拟销毁提供保护,这可能会导致重大问题。有关这方面的更多详情,请参阅SO上的The Rule of Three和许多许多帖子。

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

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)
{
}

不需要析构函数。