问题理解堆

时间:2011-08-09 06:42:14

标签: c++ memory-management heap arrays

我对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;

4 个答案:

答案 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