[英]Deallocating memory on console close event
我有C ++控制台一個看起來像這樣的應用程序:
SomeObj* obj;
BOOL WINAPI closeHandler(DWORD cEvent)
{
obj->Stop();
while( obj != 0 )
{
Sleep(100);
}
return TRUE;
}
int main(int argc, char* argv[])
{
SetConsoleCtrlHandler( (PHANDLER_ROUTINE)SignalHandler, true );
obj = new SomeObj();
obj->Execute();
delete obj;
return 0;
}
SomeObj::Execute()
本質上是一個循環,一直運行直到SomeObj::Stop()
為止。 當我執行CTRL + C組合鍵時,可以看到該應用程序在退出前已正確刪除obj
。 但是,當我單擊控制台窗口上的關閉按鈕時,我發現沒有正確刪除obj
。
進一步的調試表明,確實會調用closeHandler,但是obj
不會以某種方式被刪除。 奇怪的是,如果我在return 0
行上放置一個斷點並嘗試關閉控制台窗口,我最終會碰到該斷點並看到obj
被刪除。
我在這里做錯了什么? 有沒有更好的方法可以在控制台窗口關閉事件上釋放內容?
我猜想您的closeHandler()例程實際上並未完成,因為它正在等待obj變為0(大概是在這里表示“ NULL”或C ++ 11樣式的“ nullptr”)。 刪除對象不會將指向它的指針設置為null。 老實說,我不確定為什么會有這個循環?
我建議您的處理程序實際上並不刪除該對象。 您將obj指定為全局對象,但實際上並未在closeHandler中將其刪除。 也許像下面這樣...
BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
{
if (CTRL_CLOSE_EVENT == dwCtrlType)
{
if (NULL != obj)
{
delete obj;
obj = NULL
}
}
}
是的,有一種方法不需要您手動調用delete或將指針設置為null。 使用類似std::unique_ptr
的智能指針。 您也不必等待對象被刪除,因為一旦Execute
完成並返回了main
函數,清理將被正確處理。
#include <iostream>
#include <memory>
// sample test object that oeprates as described in your question.
struct Object
{
Object() : running_(true) {}
~Object()
{
std::cout << "Object deleted" << std::endl;
}
void Stop() { running_ = false; }
void Execute() { while(running_ == true); }
bool running_;
};
// incredibly smart pointer!
std::unique_ptr<Object> obj;
BOOL WINAPI closeHandler(DWORD)
{
// We need to call stop on the object if it exists
// use appropriate locks for multithreaded environment
if(obj != nullptr)
{
obj->Stop();
// no need to wait
}
return TRUE;
}
int main()
{
SetConsoleCtrlHandler( closeHandler, true );
// Allocate the object and execute
obj.reset(new Object());
obj->Execute();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.