Повторно 'новый' массив 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 достаточно для ваших нужд.

Другие вопросы по тегам