Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否必须删除分配给new的wchar\t?_C++ - Fatal编程技术网

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