2012-08-15 76 views
1

可以說我有一個這樣的類:我是否必須刪除我用新分配的wchar_t?

class LolClass { 
    LPWSTR* stuff; 
    LolClass::LolClass(LPWCHAR lols) { 
     stuff = new LPWSTR[100]; 
     for (int i = 0; i < 100; i++) { 
      stuff[i] = new wchar_t[wcslen(lols)+1]; 
      wcsncpy(stuffs[i], lols, wcslen(lols)+1); 
     } 
    } 
    LolClass::~LolClass() { 
     delete[] stuff; 
    } 
} 

所以如果我叫

LolClass* veryfunny = new LolClass(L"lol!"); 

那會使我100笑的,問題是,當我打電話

delete veryfunny; 

它刪除指針數組,但不是個別wchar_t的,如果我嘗試並通過wchar_t循環並刪除它們,然後我只是崩潰,我不知道該怎麼辦,因爲我知道事實,他們仍然存在,即使我刪除veryfunny後(我通過傳遞類之外的指針之一檢查)

謝謝!

+1

你是什麼「撞車」是指本身被刪除?我們可以看到的任何報告? – elyashiv 2012-08-15 06:27:59

+0

你應該循環並刪除[] stuff [i]',然後是delete [] stuff'。每個'new []'得到'delete []'。 – chris 2012-08-15 06:30:42

+0

你應該爲循環中的所有元素調用delete [] stuff [i],否則你會得到內存泄漏 – CyberDem0n 2012-08-15 06:30:55

回答

6

如果你打電話

LolClass* veryfunny = new LolClass(L"lol!"); 

,那麼你最終會需要調用:

delete veryfunny; 

但對於數組,你需要delete[]stuff[i] = new wchar_t[n]; delete [] stuff[i];

在你的代碼,你需要先循環過stuffdelete[]的元素,然後delete[]數組stuff本身。

或者只是使用std::vector<std::wstring>


更新:據我瞭解,你不是真正擔心刪除*veryfunny,而是關於如何寫一個正確的析構函數LolClass。注意析構函數也被全局和自動對象調用,例如{ LolClass x(L"hello"); } /* boom */,所以它並不重要如何你實例化一個對象LolClass。無論如何,你必須得到正確的課程。

+0

是的,字符串的向量(以及「veryfunny」根本不是指針)是明智的解決方案。 – chris 2012-08-15 06:40:10

+0

是的但多數民衆贊成在問題,當我像這樣添加一個解構器:LolClass ::〜LolClass(){if(!Count)then return;對於(int i = 0; i 2012-08-15 06:40:37

+0

@KarliRaudsepp:確定'Count'總是和'100'一樣嗎? – 2012-08-15 06:42:22

-1

大衛·施瓦茨勝畢竟WCHAR的didnt讓,因爲他們空的werent終止

+1

有**沒有任何**與內存分配根本!這是非常簡單的事實,您不能在不指向以空字符結尾的字符序列的指針上調用'wsclen'。 – 2012-08-15 08:59:23

相關問題