Повторно 'новый' массив TCHAR*
Будет ли обновление массива TCHAR* иметь отрицательный / неопределенный эффект? Или даже может быть не рекомендуется? Код ниже пока работает нормально. Нужны входы. Спасибо!
//e.g.
TCHAR *tc1 = new TCHAR[1];
// later:
//resize TCHARs
tc1 = new TCHAR[size1];
tc1[size1] = { L'\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
,
Негативный эффект "повторного обновления" заключается в том, что вы теряете указатель на первоначально выделенную память свободного хранилища. Он будет оставаться занятым на протяжении всей вашей программы, без каких-либо шансов восстановить его.
Конечно, у вас может быть какой-то другой указатель, указывающий на память, но это будет очень странный и излишне сложный кусок кода.
Избегайте всех этих проблем, используя 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::string
или же std::wstring
достаточно для ваших нужд.