C ++静态向量在退出函数后丢失数据

时间:2013-06-14 20:21:33

标签: vector static polymorphism

我有一个静态功能:

void TextManager::printDialogue(vector<Button*>* options, int optionsCount, vector<string> outputDisplayText)
{
    active = true;
    buttons = *options;
    buttonsCount = optionsCount;
    outputText = outputDisplayText;
}

“buttons”变量是静态的:

static vector<Button*>  buttons;

我在执行函数中调用printDialogue:

void WorldDoor::execute()
{
    vector<Button*> buttons;

    buttons.push_back(new CancelButton());
    buttons.push_back(new ChangeRoomButton(room));

    TextManager::printDialogue(&buttons, 2, messages); //<----

    std::vector<Button*>::iterator i = buttons.begin();

    for ( i = buttons.begin() ; i < buttons.end(); i++ )
    {
        delete * i;
    }
}

无论出于何种原因,当我调试并在printDialogue函数内部有一个断点时,“按钮”中的值完全正常。但是,在我离开printDialogue之后,我的按钮中包含的字符串变得可读,从而给出了一条错误消息:

我尝试将指针传递给数组而不是使用

vector<Button*>

但它只是读取第一个变量。现在它没有读任何东西。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

有一个名为buttons的静态成员变量,还有一个名为buttons的execute()内的局部变量。你应该重命名以避免混淆,否则,将使用局部变量而不是execute()中的静态成员变量。

答案 1 :(得分:0)

编辑:完全误解了这个问题。

执行此操作时:

vector<int*> vector1;
vector<int*> vector2;

vector1.push_back(new int(5));

vector2 = vector1;

它复制指针,而不是指针的。 因此,当您稍后迭代第一个向量并删除动态内存时,两个向量都有指向您删除的相同内存的指针,因此您的第二个向量指向无效的内存。

如果您使用的是C ++ 11,则可以使用唯一指针的向量,并将std :: move()一个向量用于另一个向量。 否则,你可以在向量上调用'clear()',而不删除内存。

以下是该函数的编写方式:

void TextManager::printDialogue(vector<Button*>* options, int optionsCount, vector<string> outputDisplayText)
{
    active = true;
    buttons = *options;
    options->clear(); //<--- Instead of crawling over it and delete-ing it.
    buttonsCount = optionsCount;
    outputText = outputDisplayText;
}

以下所有内容都是我对这个问题的误解:(包含其他可能很重要的信息)

当你这样做时:

vector<Button*> buttons;

在函数内部,您正在创建一个名为'buttons'的新向量,它会在函数调用结束时被销毁。

如果要访问全局的,请不要在函数内部创建新的,或者将它们命名为不同的。

示例:

int myVar = 100; //Declares a variable called 'myVar' at global scope.

void func()
{
    int myVar = 200; //Declares a *different* variable called 'myVar' at function scope.
    std::cout << myVar << std::endl; //Prints the one inside the function, not the one outside it.
}

顺便说一下,变量'static'不应该在全局范围内使用,除非变量属于类。 要使变量成为全局变量,您只需将其置于任何函数之外。要使类成员在该类的所有实例之间共享,请将其声明为静态,以便类知道所有实例共享一个变量。这是另一回事。 =)

如果你的代码被分成多个文件,为了使全局真正真正全局化,你必须在标题中声明它是'extern',而不是在一个源文件中声明extern,并且有其他源文件#include the标题,以此为止。略显笨重,但这就是它的完成方式。他们正在为它建立一个更好的系统,但它要标准化还需要几年时间。