【发布时间】:2014-05-14 16:43:06
【问题描述】:
我有一个Window 类,它是一些 C 结构的包装器。
该类有一个静态vector<Window*> windows_,它是一个包含已创建窗口的列表。 Window 构造函数做了两件事:
-
handle_ = SDL_CreateWindow( ... );基本上分配了 C 结构并将指针存储在成员变量handle_中; - 在列表中推送
this。
Window 析构函数做了三件事,但前提是handle_ 不是nullptr:
-
SDL_DestroyWindow()释放 C 结构体; - 从列表中删除
this。 handle_ = nullptr;
然后,在我的main 中,我将Window 声明为局部变量。
当窗口接收到CLOSE 事件时,我调用该窗口的析构函数。
然后,当窗口超出范围时,再次调用窗口的析构函数,我收到分段错误。
我知道明确调用析构函数很微妙,但我真的不知道为什么。
所以问题是双重的:
为什么会崩溃?
我可以使用什么设计来避免调用析构函数?
【问题讨论】:
-
我认为如果您可以发布代码示例会更容易为您提供帮助。
-
您推送的
this在离开创建代码调用方的范围时将被销毁。手动触发析构函数是一个坏的主意。 -
您似乎已经明白为什么显式调用对象的析构函数很少是一个好主意:当对象结束其常规生命周期时,它很可能会再次被调用。
-
如果您希望能够在作用域结束之前将其销毁,请不要使用自动变量!
-
关闭窗口和销毁窗口实际上是同义词吗?如果是这样,则不应关闭窗口,应将其销毁并关闭。如果不是,则关闭时不应销毁窗口,而应将其关闭并在适当的时间进行销毁。
标签: c++ destructor