Освобождение памяти в проблеме c ++ (Visual Studio 2010) - PullRequest
0 голосов
/ 10 июля 2010

Я пытаюсь выучить C ++, в процессе я попытался написать функцию, которая получает два указателя на символы и соединяет второй с первым (я знаю, что для этого есть strcat).
Но я хочу изменить первый указатель параметра, чтобы он указывал на результат. по этой причине я использовал ссылку на указатель в первом параметре.

Прежде чем вернуться из функции, я хочу освободить память первого параметра, но у меня появляется ошибка.

Вот код:

void str_cat(char*& str1, char* str2)
{
 if (!str1)
 {
  str1 = str2;
  return;
 }
 if (!str2)
  return;
 char * new_data = new char[strlen(str1) + strlen(str2) +1];
 char * new_data_index = new_data;
 char * str1_index = str1;
 char * str2_index = str2;

 while(*str1_index)
  *new_data_index++ = *str1_index++;
 while(*str2_index)
  *new_data_index++ = *str2_index++;
 *new_data_index = NULL;

 delete str1; //ERROR HERE (I also tried delete[] str1)

 str1 = new_data;
}

Я не понимаю, почему.
Есть предложения?

Спасибо
Итай \

EDIT Вот как я использую функцию

char * str1 = NULL;
char * str2 = NULL;
str_cat(str1, "abc");
str_cat(str2, "def");
str_cat(str1, str2);

Ответы [ 2 ]

7 голосов
/ 10 июля 2010

Вы можете удалить только те вещи, которые были выделены с новым - если ваш код выглядел так:

str_cat( "foo", "bar" );

это было бы незаконно. По сути, ваша функция в ее нынешнем виде совершенно небезопасна. Лучше было бы вернуть новую строку через возвращаемое значение функции. Еще лучше, забудьте всю идею и используйте std :: string.

Хотя обучение использованию ссылок на указатели похвально, вы должны знать, что они очень редко используются в программировании на C ++. Вам гораздо лучше посоветовать потратить время на изучение функций стандартной библиотеки C ++.

3 голосов
/ 10 июля 2010

При первом вызове str_cat() str1 присваивается адрес строкового литерала, который вы передали "abc".
С третьим вызовом это становится проблемой, когда вы пытаетесь набрать delete str1, что, как указал Нейл, недопустимо для строковых литералов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...