簡體   English   中英

在控制台關閉事件上取消分配內存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM