再 - '新' TCHAR *数组

时间:2017-12-23 11:21:17

标签: c++ resize tchar

TCHAR *数组的重新会产生负面/未定义效果吗?甚至可能不推荐?到目前为止,下面的代码一直很好。需要输入。谢谢!

//e.g.
TCHAR *tc1 = new TCHAR[1];

// later:

//resize TCHARs
tc1 = new TCHAR[size1];
tc1[size1] = { L'\0' }; 

2 个答案:

答案 0 :(得分:2)

这是内存泄漏。您需要delete new来电创建的任何内容。如果你这样做,一切都很好:

//e.g.
TCHAR *tc1 = new TCHAR[1];

// later:

//resize TCHARs
delete [] tc1; 
tc1 = new TCHAR[size1];
tc1[size1] = { L'\0' };

虽然在一个不相关的注释中,你的最后一行是在你分配的数组后面写的。那是罚款。但它与你的内存分配无关,这本身就是一个错误。

如果使用字符串类,可以避免很多这种情况。 std::string或者如果您使用的是MFC CString

答案 1 :(得分:2)

"重新出现的负面影响"是你丢失了指向最初分配的免费商店内存的指针。它将在整个程序的剩余时间内保持占用状态,没有任何机会回收它。

当然,你可能有一些其他指针指向内存,但这将是一段非常奇怪且不必要的复杂代码。

使用std::vector代替new[]来避免所有这些问题。

tc1 = new TCHAR[size1];
tc1[size1] = { L'\0' };

除了内存泄漏之外,这是未定义的行为,因为size1是最后一个有效索引之后的一个。

这是std::vector示例:

std::vector<TCHAR> tc1(1);

// later:

//resize TCHARs
tc1.resize(size1);
tc1[size1 - 1] = L'\0'; 

即使std::stringstd::wstring,也可满足您的需求。