gpt4 book ai didi

.net - 为什么我的函数范围静态变量在对象实例之间持续存在?

转载 作者:行者123 更新时间:2023-12-02 08:53:27 24 4
gpt4 key购买 nike

我今天发现了一个非常阴险的错误的根源。现在一切都已安全修复,但我想了解为什么当我执行以下代码时:

using namespace System;

ref class EvilClass
{
public:
EvilClass()
{

}

void Print()
{
static bool enablePrint = false;
if( enablePrint )
{
Console::WriteLine("PrintEnabled");
}
else
{
Console::WriteLine("PrintDisabled");
}
enablePrint = true;
}

};


int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");

EvilClass^ ec = gcnew EvilClass();

ec->Print();
ec->Print();

delete ec;
ec = nullptr;

ec = gcnew EvilClass();

ec->Print();
ec->Print();

delete ec;
ec = nullptr;

return 0;
}

...我得到以下信息:

Hello World
PrintDisabled
PrintEnabled
PrintEnabled
PrintEnabled

我一直认为静态只会在对类的同一实例的调用之间持续存在?

最佳答案

你的假设是不正确的。函数范围的静态变量与全局变量非常相似。它只有一个全局实例。更多详细信息请参见:What is the lifetime of a static variable in a C++ function?

关于.net - 为什么我的函数范围静态变量在对象实例之间持续存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6792253/

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