超出范围时是否删除了指向堆栈对象的指针?

时间:2017-11-18 21:11:48

标签: c++ pointers

我很难完全理解我应该在我班级中使用指针成员做什么。我知道用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格式是这样的:

我的指针指向堆栈对象吗?当类死亡时,指针本身会吗?或者我必须删除它们吗?

3 个答案:

答案 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)

此类中没有创建新的动态元素,因此您无法销毁它。