理解主功能中的静态对象
Understaning of static objects in main function
我正在尝试构建应用程序,如果它是gui应用程序还是控制台,将根据控制台参数进行选择。
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QCommandLineParser parser;
parser.setApplicationDescription("Test");
parser.addHelpOption();
parser.addVersionOption();
QCommandLineOption guiOption(QStringList() << "g" << "gui", "Gui");
parser.addOption(guiOption);
parser.process(app);
bool isGUI = parser.isSet(guiOption);
APPstub stub(0,isGUI);
if (isGUI) { //GUI APP
static APP_Window ui(&stub); ////*****THIS
ui.show();
}
else { // CONSOLE APP
static APP_Console con(&stub); ////*****THIS
con.showMenu();
}
return app.exec();
}
我发现我需要在条件下创建这些对象(////*****THIS(需要是静态的,但我不明白为什么?问题是:例如,当我在条件之外使用APP_Window ui(&stub(时,它就工作了,并显示了gui。如果我把它放在这种情况下,Window会弹出并迅速消失。
我对此感到困惑。。。你能帮我理解那个问题吗?谢谢:(
如果未声明为静态,则APP_Window对象是声明它的{}块的本地对象。一旦在块之外,对象就会被解除分配。任何本地对象都被分配到堆栈上,一旦我们到达块的末尾,编译器就会自动释放该堆栈。
在{}块(或函数(中声明为静态的对象实际上是具有局部可见性的全局对象。因此,它是持久的,直到应用程序退出。
例如,这些局部变量仅在定义它们的块中可见且有效:
{
int i = 3;
...
}
或
void f() {
int x = 5232;
}
现在这些变量是全局的,尽管它们只有一个局部作用域(在声明它们的块中(:
{
static int i = 3;
...
}
或
void f() {
static int x = 5232;
}
因为当你的代码离开大括号时:"con"answers"ui"对象将被销毁,因为如果它们不是静态的,它们的范围会受到大括号的限制。
使它们成为static
将延长所创建对象的生存期,直到程序结束。
如果没有static
,则生存期将在定义变量的作用域的末尾结束。
如果对象不是static
,它们将在其包含块的末尾(在关闭的}
处(停止存在,并且它们的析构函数将被调用。
假定对象是以某种方式注册的,因此它们在app.exec()
的调用中使用。然后,它们的析构函数将注销它们,因此不能使用。
相关文章:
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 我可以读取静态对象中的文件.txt吗?C++
- 通过 Gazebo 世界插件将静态对象附加到机器人链接
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- 完全释放静态对象内存
- 静态对象指针
- C++文件中.cpp静态对象声明
- C++类中定义静态对象
- 在初始化类的静态对象之前,是否保证初始化该类的静态成员?
- 静态对象如何调用私有构造函数
- cpp 静态对象实例化
- 等效于 Java 静态对象类C++
- 我怎么知道C++编译器是否制作线程安全的静态对象代码
- 在dlclose()之前破坏的静态对象
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- c++ 防止类共享静态对象
- 什么时候构造函数为静态对象
- 为什么本地静态对象的初始化使用隐藏的防护标志?