2013-02-07 49 views
0

有一個創建的類拋出一個new關鍵字和一個指向它的指針,然後調用一個方法從類中銷燬它自己的類,我是否需要從內存中釋放內存指針與否?財產以後這樣的:C++指針類和類的破壞

.H

#include <list> 
#include <iostream> 
class Test 
{ 
public: 
    Test(); 
    ~Test(); 
    void destroy(); 
    bool operator==(Test& right){return id == right.id;}; 
private: 
    static int count; 
    std::list<Test*>::size_type id; 
    static std::list<Test*> instances; 
}; 

的.cpp

#include "Test.h" 
int Test::count = 0; 
std::list<Test*> Test::instances; 
Test::Test() 
{ 
    instances.push_back(this); 
    id = count++; 

} 
Test::~Test() 
{ 
} 

void Test::destroy() 
{ 
    for(auto t : instances){ 
     if(*t == *this) 
     { 
      delete t; 
      break; 
     } 
    } 
} 

Test* n = new Test(); 
n->destroy(); 

所以我的問題是內存指向n被釋放出來?或者我應該打電話delete n

+1

這是惡意代碼... – nneonneo

+0

爲什麼在range-for循環中,你只想刪除'this'指向的當前元素的元素?在這種情況下你不是在泄漏記憶嗎? – 0x499602D2

+0

是的,在銷燬,只是有**刪除此; **,但它看起來像你可以只是做**刪除N; **保存所有的麻煩。使用類似*刪除這個的一個原因是*;如果你想在destroy(。)中減少引用計數,並且只有在0時才刪除。 – thang

回答

0

這是在評論中討論過的情況,以防有人在以後發現。

基本上,看起來你正試圖封裝Windows的窗口機制,並想要銷燬WM_DESTROY上的窗口類。

你有一張地圖,從HWND映射到類:

1.破壞功能選項

 map<HWND,CLASS*> instances; 

當收到WM_DESTROY,你可以做兩件事情之一

instance[hwnd]->destroy(); 

裏面的破壞,你會看起來像這樣的東西:

void CLASS::destroy() { 
    // assuming hwnd is a member (probably m_hwnd) 
    instance.erase(hwnd); 
    // do some cleanup, and then delete the instance 
    delete this; 
} 

2.在這種情況下刪除選項

delete instance[hwnd]; 
instance.erase(hwnd); 

,你必須把所有的清理代碼到類的析構函數。

選項2可能更優選,因爲它不需要你做刪除此;,雖然技術上沒問題,但對某些人來說可能並不吸引人。

1

這會工作,但爲什麼這樣呢?爲什麼不只是delete n