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