我对c ++中的堆有一个小的理解问题。
我创建了一个小类来将Wchar_t-Array转换为Char-Array。这是我的转换类的一部分:
·H
class ConvertDataType
{
private:
char *newChar;
};
的.cpp
size_t i;
char *newChar = new char[wcslen(WcharArray)];
wcstombs_s(&i, newChar, strlen(newChar), WcharArray, wcslen(WcharArray));
return newChar;
在Cpp-File中,我在堆中动态创建一个新的Char-Array。 如何正确删除变量?我读了很多不同的例子......
delete[] newChar;
在for循环中:
delete[] newChar[i];
我会这样做:
~ConvertDataType(void) //deconstructor
{
delete[] newChar;
}
这是对的吗? newChar[i]
中的内容会怎样?我只是破坏指针,不是吗?
好吧,我还有问题,如果我使用该类,会发生内存泄漏?
怎么会这样?我添加到我的解构函数delete[] newChar;
。
答案 0 :(得分:2)
你做的事情是正确的,通过operator new[]()
内存分配应该通过operator delete[]()
解除分配。
但在这里我看到另一个问题:
wcstombs_s(&i, newChar, strlen(newChar), WcharArray, wcslen(WcharArray));
第三个参数实际上不是你想要的。您希望传递缓冲区的大小,但是传递从newChar
的第一个位置开始直到第一个空字符的字符数(有关详细信息,请参阅strelen()
的手册)。在这里,您需要wcslen(WcharArray) + 1
(1为额外的空字符)作为第3个参数,因为它是分配的内存块的实际长度,也应该由new char[wcslen(WcharArray) + 1]
分配。
答案 1 :(得分:1)
调用delete[] newChar
是正确的方法。
将为已删除数组中的所有对象/字符调用理论上的析构函数。但由于char
是一种原始类型,它什么都不做。无论如何,在删除数组后,您不应该访问newChar[i]
。
答案 2 :(得分:0)
您的解决方案是正确的。当你调用delete []
时,指针引用的内存块被设置为空闲,但仅此而已。在您在此地址块中分配另一个内存并覆盖数据之前,您的内容仍将存在。但你不能依赖从已删除的内存中读取。有时候它会起作用,但这是“意外”。
答案 3 :(得分:0)
使用
size_t new_size = wcslen(WcharArray);
size_t number_of_converted = 0;
this->newChar = new char[new_size];
wcstombs_s(&number_of_converted, this->newChar, new_size, WcharArray, new_size);
而不是
char *newChar = new char[wcslen(WcharArray)];
在第二种情况下,您创建一个局部变量。在Windows上,我会使用WideCharToMultiByte进行转换:
DWORD mb_size = WideCharToMultiByte(
CP_UTF8, // UTF-8 encoding
0, // flags
WcharArray, // wide char input
-1, // find the end of string
NULL, // no input, we want to know the necessary space
NULL, // no input size
NULL, // no default chars
NULL ); // no used default chars
this->newChar = new char[mb_size];
mb_size = WideCharToMultiByte(
CP_UTF8, // UTF-8 encoding
0, // flags
WcharArray, // wide char input
-1, // find the end of string
this->newChar, // target string
mb_size, // target string size
NULL, // no default chars
NULL ); // no used default chars