我很难完全理解我应该在我班级中使用指针成员做什么。我知道用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格式是这样的:
我的指针指向堆栈对象吗?当类死亡时,指针本身会吗?或者我必须删除它们吗?
答案 0 :(得分:1)
您仅需要在delete
返回的指针上调用new
。这条规则也不例外。
在你的情况下,
pm_Moves = &Moves(*this);
正在指定一个指向匿名临时 Moves(*this);
的指针。在声明之后,指针立即失效!使用该指针执行任何操作的程序行为是 undefined 。
所以你显然需要重新设计这一切。考虑在重构时查看std::unique_ptr
。
答案 1 :(得分:0)
我知道用new []创建的任何指针都必须删除 删除[]
我一遍又一遍地看到这种困惑。 您不会删除指针,删除对象。或者更好地理解,如果你谈论malloc
/ free
:你没有自由指针,你释放内存。指针只指向您需要删除的对象/内存。
E.g:
int a = 24; // just an int
int* p1 = new int; // new allocates memory for an int,
// creates an int at that location
// and then returns a pointer to this newly created int
// p1 now points to the newly created int
int* p2 = p1; // p2 now also points to the created int
p1 = a; // p1 now points to a
// what do we delete now? p1?
// no, we don't delete pointers,
// we delete objects dynamically created by new
// what pointer points to those objects?
// at this line it is p2
// so correct is:
delete p2;
答案 2 :(得分:-1)
此类中没有创建新的动态元素,因此您无法销毁它。