2012-08-15 70 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

相关问题