从我收集到的信息来看,必须删除已经用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;
};
和其他指针类型