【发布时间】:2018-05-02 10:30:23
【问题描述】:
我很难准确地理解我应该对我的类中的指针成员做什么。我知道用 new[] 创建的任何指针都必须用 delete[] 删除
但是,如果我的指针指向在堆栈上创建的对象的地址怎么办?我必须删除它吗?或者当类被销毁时它会被删除。如果是这样,我应该以什么方式删除它?澄清问题,这是我的一些代码。
移动头文件:Moves.h
#pragma once
#include "ShuffleBag.h"
class Character;
class Moves
{
private:
Character* pm_User;
ShuffleBag m_HitChances;
public:
Moves (Character& user);
~Moves ();
};
我们可以看到我有一个指向字符对象的指针成员。
Moves 源文件:Moves.cpp
#include "Moves.h"
#include "Character.h"
Moves::Moves (Character& user)
{
m_HitChances = ShuffleBag ();
m_HitChances.Add (true, 8);
m_HitChances.Add (false, 2);
pm_User = &user;
}
Moves::~Moves ()
{
}
在这里我们可以看到我将这个指针分配给了字符对象的传入引用的地址。
字符头文件:Character.h
#pragma once
#include "Moves.h"
#include "ShuffleBag.h"
class Character
{
public:
int m_Health;
int m_Energy;
Moves* pm_Moves;
public:
Character ();
Character (int health, int energy);
~Character ();
};
同样,这里我有一个指向该角色移动集的指针。这是因为移动没有默认构造函数。
字符源文件:Character.cpp
#include "Character.h"
Character::Character ()
{
m_Health = 100;
m_Energy = 50;
pm_Moves = &Moves (*this);
}
Character::Character (int health, int energy)
{
m_Health = health;
m_Energy = energy;
pm_Moves = &Moves (*this);
}
Character::~Character ()
{
}
在这里,我为这个指针分配了新创建的 Moves 对象的地址。所以我的 TL;DR 格式的问题是这样的:
我的指针是否指向堆栈对象,当类死亡时,指针本身会吗?还是我必须删除它们?
【问题讨论】:
-
首先,课程永不消亡。实例(=对象)有时会这样做。其次,您必须确定实例 Character 是否是 Moves 对象的 所有者。如果是这样,如果应该在析构函数中显式删除它(在释放字符时调用)。第三,你最好使用智能指针。
-
只有操作员
new创建的对象才需要是deleted。需要注意的一件事是指向超出范围的对象的指针 - 该指针无法取消引用,因为它指向不再存在的对象。