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

时间:2015-05-31 09:17:46

标签: c++ object stack

根据我收集的内容,删除已经使用 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关键字删除它们,那么我实现的堆栈就会停止工作。因此我不知道如何以及在何处删除所有这些对象!

2 个答案:

答案 0 :(得分:4)

int* p1 = new int; int* p2 = p1; 通过指针值(地址)作用于对象。指针变量本身是无关紧要的。例如:

new

在这个示例中,我只调用了delete一次,因此我只需要调用p1一次,并且多次调用它将是一个错误。我是以p2作为参数还是// statements 来调用它并不重要,因为它们都指向同一个对象。但我应该只在其中一个上调用它,而不是两个。

现在,这是如何适用于您的情况。据推测,在您遗漏的代码中的某个地方,被删除为:

row is null

在那里的某个地方,您可以从本地指针变量分配到类的成员指针变量,或者在函数外部保留的其他内容。如果你没有这样做,那么你无法访问函数之外的已分配对象,并且你有内存泄漏。

因此,假设您这样做了,本地指针超出范围并不重要,因为您将它们复制到范围内 的成员变量。因此,当您准备删除对象时,可以通过这些成员指针变量来完成。

答案 1 :(得分:3)

  

&#34;因此我不知道如何以及在何处删除所有这些对象!&#34;

最好的解决办法是完全摆脱自己的delete,但将其留给适当的smart pointer,例如

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

以及所有其他指针类型。