Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 防止一个物体立即被摧毁_C++_Pointers_Singleton - Fatal编程技术网

C++ 防止一个物体立即被摧毁

C++ 防止一个物体立即被摧毁,c++,pointers,singleton,C++,Pointers,Singleton,我试图创建一个类对象的单个实例,通过包含头并调用getInstance方法的适当形式,使需要它的任何其他类都可以访问该实例。我试图通过如下所示的单一实例来实现这一点,但由于某种原因,这个单一实例一创建就被销毁 下面是头文件Window.h的副本 生成并运行此代码后,以下行将按以下顺序打印到控制台: Just before construction Window constructor called Window destructor called Just after construction

我试图创建一个类对象的单个实例,通过包含头并调用getInstance方法的适当形式,使需要它的任何其他类都可以访问该实例。我试图通过如下所示的单一实例来实现这一点,但由于某种原因,这个单一实例一创建就被销毁

下面是头文件Window.h的副本

生成并运行此代码后,以下行将按以下顺序打印到控制台:

Just before construction
Window constructor called
Window destructor called
Just after construction
这告诉我,在getInstance有机会返回它之前,我创建的窗口的实例已经被销毁了。我不确定如何防止这种情况发生。我曾尝试使用一个普通的Window实例,而不是一个点来查看引用soldInstance的注释掉的代码行,但这只会给我链接器错误

非常感谢您的帮助。

您的问题在这里:\u instance=&Windowtitle,width,height; 您将获得一个临时窗口的地址,该窗口在离开作用域后被销毁

将其更改为:_instance=新窗口标题、宽度、高度

但请确保在退出程序之前删除该窗口

更好的解决方案是在退出时自动删除窗口:

Window* Window::getInstance(const std::string &title, int width, int height) {
    static Window window{title, width, height};
    return &window;
}
这将创建一个临时对象并获取其地址。一旦表达式完成,对象就会被销毁,剩下的指针将悬空

要创建以更持久的方式存储的对象,请使用new操作符从堆中分配:

_instance = new Window(title, width, height);
使用这种单例方法时要小心。首先,您请求一个实例并提供参数,这些参数可以使用,也可以不使用。如果从未创建过对象,则使用提供的参数创建窗口。但是,如果已经创建了窗口,则会忽略提供的参数,并且只会得到其中发生的任何内容。这最终会让某些人感到惊讶和愤怒。放心。
问题二,内存管理。在某个时候,您应该删除此指针。也许你可以把它保存在程序关机中,把它存储在一个UngQuypTR中,然后你可以用MaxiOpLoad分配它,但是你应该考虑你做出的任何选择的后果。无论如何,让你的构造函数私有化吧。我很惊讶_instance=&Windowtitle,width,height;编译。你没有至少得到一个警告吗?如果没有,请打开警告。这将创建一个临时对象,该对象将一直存在到相应的}为止,该}比您想要的要早得多。通常使用static,这是因为您没有遵循示例。是什么让你觉得新的东西是不必要的?如果你不知道新的目的,你可能应该查一下。我相信,重要的是要知道,在C++中,动态分配的作用不是像C那样多,而且至少对C++中对象的生存期有一点把握,尤其是当您需要操作指针时。@ NWP没有发生警告。注意OP也有窗口*窗口::GETSimple。
Window* Window::getInstance(const std::string &title, int width, int height) {
    static Window window{title, width, height};
    return &window;
}
_instance = &Window(title, width, height);
_instance = new Window(title, width, height);