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

标签 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 格式的问题是这样的:

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

最佳答案

需要对new 返回的指针调用delete。这条规则也不异常(exception)。

虽然在你的情况下,

pm_Moves = &Moves(*this);

正在分配一个指向匿名临时 Moves(*this); 的指针。就是那个指针在语句之后立即失效!将该指针用于任何事物的程序行为是未定义

所以您显然需要重新设计所有这些。重构时考虑查看 std::unique_ptr

关于c++ - 超出范围时是否删除了指向堆栈对象的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47371101/

相关文章:

c++ - 如何在大型 C++ 程序中为所有 double 类型的数字设置小数精度

c++ - 在 operator<< 中将 union 作为参数传递时出错

c++ - .net c++/cli 获取指针的内容

c++ - 未处理的异常在 0x00C87963 在 .... : 0xC0000005: Access violation reading location 0xCCCCCCE0

c++ - 将 shared_ptr 作为指向指针的指针传递

C++ -- 指向数组的指针 -- 指针数组

c++ - 在没有线程支持的程序加载的共享库中使用 C++11 多线程

c++ - 在调用时仅指定一些模板参数

c++ - 减少到二分匹配

c - C 中的简单字符串密码(const char 困难)