gpt4 book ai didi

c++ - 我在哪里删除对象?我不在范围内

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:56 25 4
gpt4 key购买 nike

从我收集到的信息来看,必须删除已分配给 new 的所有内容。话虽如此,我觉得我超出了我的程序范围,无法访问和删除这些对象。

游戏状态堆栈.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;

游戏状态堆栈.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,调用它不止一次会出错。我用 p1p2 作为参数调用它并不重要,因为它们都指向同一个对象。但我应该只对其中之一调用它,而不是同时调用它。

现在,这如何适用于您的情况。据推测,您遗漏的代码中的某处缩写为:

// statements

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

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

关于c++ - 我在哪里删除对象?我不在范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30555777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com