C++ 我是否必须删除分配给new的wchar\t?
假设我有一门课是这样的:C++ 我是否必须删除分配给new的wchar\t?,c++,C++,假设我有一门课是这样的: 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], lol
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;
}
}
这将使我100 lol的,问题是当我打电话
delete veryfunny;
它会删除指针数组,但不会删除单个wchar__________________________________________________________
谢谢 如果你打电话
LolClass* veryfunny = new LolClass(L"lol!");
然后你最终需要打电话:
delete veryfunny;
但是对于数组,您需要delete[]
:stuff[i]=new-wchar\u t[n];删除[]项内容[i]代码>
在代码中,您需要首先循环stuff
和delete[]
元素,然后delete[]
数组stuff
本身
或者只使用std::vector
更新:据我所知,您实际上并不担心删除*veryfunny
,而是担心如何为LolClass
编写正确的析构函数。请注意,析构函数也会为全局和自动对象调用,例如,{lolclassX(L“hello”);}/*boom*/
,因此如何为LolClass
实例化对象并不重要。在任何情况下,你都必须正确安排课程。如果你打电话
LolClass* veryfunny = new LolClass(L"lol!");
然后你最终需要打电话:
delete veryfunny;
但是对于数组,您需要delete[]
:stuff[i]=new-wchar\u t[n];删除[]项内容[i]代码>
在代码中,您需要首先循环stuff
和delete[]
元素,然后delete[]
数组stuff
本身
或者只使用std::vector
更新:据我所知,您实际上并不担心删除*veryfunny
,而是担心如何为LolClass
编写正确的析构函数。请注意,析构函数也会为全局和自动对象调用,例如,{lolclassX(L“hello”);}/*boom*/
,因此如何为LolClass
实例化对象并不重要。无论如何,你都必须正确对待这个类。大卫·施瓦茨赢了毕竟,wchar不让自己被删除是因为他们没有空终止大卫·施瓦茨赢了毕竟,wchar不让自己被删除是因为他们没有空终止你说的“崩溃”是什么意思?我们能看到任何报告吗?你应该循环浏览并删除[]内容[i]
,然后是删除[]内容
。每个new[]
都会得到一个delete[]
。对于循环中的所有元素,都应该调用delete[]stuff[i],否则会导致内存泄漏。它会出现类似“调试断言失败”的情况。。。“第52行”()。。。“\u Block\u type\u is\u valid(pHead->nBlockUse)”发生崩溃时,您应该做的第一件事是在调试器中运行程序。这将帮助您找到崩溃的位置,还可以检查变量以帮助您找到崩溃的原因。您所说的“崩溃”是什么意思?我们能看到任何报告吗?你应该循环浏览并删除[]内容[i]
,然后是删除[]内容
。每个new[]
都会得到一个delete[]
。对于循环中的所有元素,都应该调用delete[]stuff[i],否则会导致内存泄漏。它会出现类似“调试断言失败”的情况。。。“第52行”()。。。“\u Block\u type\u is\u valid(pHead->nBlockUse)”发生崩溃时,您应该做的第一件事是在调试器中运行程序。这将帮助您找到崩溃的位置,还可以让您检查变量以帮助您找到崩溃的原因。是的,字符串向量(以及veryfunny
根本不是指针)是明智的解决方案。是的,但当我添加这样的解构器时,这就是问题:LolClass::~LolClass(){if(!Count)然后返回;对于(int i=0;iCount
总是与100
相同吗?@KarliRaudsepp:发布不起作用的代码,我们将帮助你修复它。有很多事情你可能做错了,我们很难找出哪一件是你的问题。但是是的,如果你新建它,你必须删除它。如果您new[]
it,则必须delete[]
it。1)如果在两个do
循环之间的目录中添加了一个新条目,则代码会爆炸。2) 我认为你没有为每个全名分配足够的内存——你复制的字节比分配的字节多。是的,字符串向量(以及veryfunny
根本不是指针)是明智的解决方案。是的,但当我添加这样的解构器时,这就是问题:LolClass::~LolClass(){if(!Count),然后返回;例如(inti=0;iCount
总是和100
一样吗?@KarliRaudsepp:发布不起作用的代码,我们会帮你修复。你可能做了很多错事,我们很难找出哪一件是你的问题。但是,是的,如果你新建它,你必须删除它。如果你new[]
it,你必须delete[]
it。1)如果在两个do
循环之间的目录中添加了一个新条目,你的代码就会爆炸。2) 我认为你没有为每个全名分配足够的内存——你比分配的多复制了一个字节。这与内存分配毫无关系!这是一个非常简单的事实,您不能对不指向以null结尾的字符序列的指针调用wsclen
。这与内存分配无关!这是一个非常简单的事实,您不能调用wscl