我想确保我正确地创建/销毁此对象......
这是我的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
?
答案 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)
{
}
不需要析构函数。