在哪里删除对象?我超出了范围



从我收集到的信息来看,必须删除已经用new分配的任何内容。话虽如此,我觉得我已经超出了我的项目范围,无法访问&删除这些对象

GameStateStack.h

#include <iostream>
class node
{
public:
    std::string gameState;
    node * nextGameState;
};
class GameStateStack
{
private:
    node * _topState;
    void Destory();
public:
    int gameStatesCount;
    void PushGameState(std::string element);
    void PopGameState();
    std::string CurrentGameState();
    GameStateStack();
    ~GameStateStack();
};
extern GameStateStack state;

GameStateStack.cpp

GameStateStack state;
GameStateStack::GameStateStack()
{
    _topState = NULL;
    gameStatesCount = 0;
}
GameStateStack::~GameStateStack()
{
}
void GameStateStack::PushGameState(std::string gameStateName)
{
    node *newTopState = new node;  // LOCAL VARIABLE
    if (_topState == NULL)
    {
      // statements
    }
    else
    {
      // statements
    }
}
void GameStateStack::PopGameState()
{
    if (_topState == NULL)
        std::cout << "Error: no gamestates available to pop";
    else
    {
        node * old = _topState;  // LOCAL VARIABLE
        // statements
    }
}
std::string GameStateStack::CurrentGameState()
{
    node *temp;  // LOCAL VARIABLE
    // statements
}
void GameStateStack::Destory()
{
    node *abc;  // I CREATED THIS VARIABLE TO ACCESS _topState variable and delete it
    delete _topState;
    delete abc->nextGameState;
    delete abc; // and then I deleted abc.
}

你可以阅读评论,看看我在哪里发布了LOCAL VARIABLE那些我不能在析构函数中访问的,因此我不能删除它们。如果我试图在它们自己的作用域中使用delete关键字删除它们,我实现的堆栈就会停止工作。因此,我不知道如何以及在哪里删除所有这些对象!

delete通过指针值(地址)作用于对象。指针变量本身是无关的。例如:

int* p1 = new int;
int* p2 = p1;

在这个例子中,我只调用了new一次,所以我只需要调用delete一次,多次调用它将是一个错误。不管我是用p1作为参数还是用p2来调用它,都没有关系,因为它们都指向同一个对象。但是我应该只调用其中一个,而不是两个。

现在,这如何适用于你的情况。大概是在代码中您遗漏的某个地方,缩写为:

// statements

在这里的某个地方,您将本地指针变量赋值给类的成员指针变量,或者在函数外部持久存在的其他东西。如果您不这样做,那么您就无法访问函数外部分配的对象,并且您有内存泄漏。

因此,假设您确实这样做了,那么局部指针在作用域之外并不重要,因为您将它们复制到在作用域中的成员变量中。所以,当你准备删除你的对象时,你可以通过那些成员指针变量来做。

"因此我不知道如何以及在哪里删除所有这些对象!"

最好的解决方案是完全不调用delete,而是把它留给一个合适的智能指针,例如

class node {
public:
    std::string gameState;
    std::unique_ptr<node> nextGameState;
};

和其他指针类型

最新更新