我很难理解我应该如何处理我的类中的指针成员。我知道任何用 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.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 格式的问题是这样的:
我的指针是否指向堆栈对象,当类死亡时,指针本身会指向吗?还是我必须删除它们?
最佳答案
您仅需要对new
返回的指针调用delete
。这条规则也不异常(exception)。
虽然在你的情况下,
pm_Moves = &Moves(*this);
正在分配一个指向匿名临时 Moves(*this);
的指针。就是那个指针在语句之后立即失效!将该指针用于任何事物的程序行为是未定义。
所以您显然需要重新设计所有这些。重构时考虑查看 std::unique_ptr
。
关于c++ - 超出范围时是否删除了指向堆栈对象的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47371101/