0

Я относительно новичок, когда дело доходит до C++, поскольку я был выровнен на Java для большей части моей учебной программы (это позор). Управление памятью было затруднительным, но я купил ряд книг на ansi C и C++. Я проговорил связанные вопросы, но не смог найти тот, который соответствовал бы этим конкретным критериям. Может быть, это настолько очевидно, что никто не упоминает об этом?Удаление неоригинального динамического массива с помощью указателя

Этот вопрос прослушивал меня, но я чувствую, что есть концептуальная точка, которую я не использую.

Пусть:

char original[56]; 
cstr[0] = 'a'; 
cstr[1] = 'b'; 
cstr[2] = 'c'; 
cstr[3] = 'd'; 
cstr[4] = 'e'; 
cstr[5] = '\0'; 
char *shaved = shavecstr(cstr); 
// various operations, calls // 
delete[] shaved; 

Где

char* shavecstr(char* cstr) 
{ 
    size_t len = strlen(cstr); 
    char* ncstr = new char[len]; 
    strcpy(ncstr,cstr); 
    return ncstr; 
} 

В том, что все дело в том, чтобы иметь «оригинальный» быть буфер, который заполняет с символами и обычно имеет свою копию побрился и используется в других местах.

Для уточнения, оригинал заполняется через std::gets(char* buff), std::getline(char* buff, buff_sz), std::read(char* buff, buff_sz) или любым считывающим устройством ввода на месте. Чтобы «побрить» строку, она в основном усечена, что исключает неиспользуемое пространство массива.

Ошибка является ошибкой выделения кучи и разделится на delete[].

Чтобы предотвратить утечку, я хочу освободить память, хранящуюся «бритой», которая будет использоваться снова после того, как она пройдет через некоторые аргументы. Вероятно, есть веская причина, почему это ограничено, но должен быть какой-то способ освободить память, поскольку в этой конфигурации нет доступа к исходному владельцу (указателю) данных.

+0

Где используется ваш «оригинальный» буфер? Предполагается ли 'cstr' быть« оригинальным »? – mch

+1

В чем проблема, с которой вы сталкиваетесь? Есть ли ошибка компилятора? Помимо неправильных имен переменных, и я не понимаю, что вы пытаетесь выполнить с помощью «бритья», в чем проблема? Если вы серьезно относитесь к использованию C++, вы должны использовать 'std :: string', а не' char * ', и просто избегайте всего этого управления памятью. – mch

+0

И стоит ли cstrn быть cstr? –

ответ

1

Я предполагаю, что вы заменили бы original на cstr, иначе код не будет скомпилирован как cstr не объявлен.

Ошибка здесь в том, что размер выделенного массива слишком мал. Вы хотите, чтобы char* ncstr = new char[len+1]; отвечал за завершение \0.

Кроме того, если вы удалите shaved сразу после завершения функции, нет смысла в вызове функции ...

[*] Для того, чтобы пойти немного глубже, память, используемая для cstr будет выпущен, когда содержащий функцию. Обычно такие статические строки помещаются в константы, которые живут в течение всей продолжительности приложения. Например, вы можете иметь const char* cstr="abcde"; вне всех ваших функций. Затем вы можете передать эту строку без необходимости динамически распределять ее.

0

Предполагая, что вы имели в виду использовать cstr вместо cstrn ...

Вы не должны удалять cstr. Вы должны удалить shaved.

Вы только delete память, которая была выделена new. And delete[] память была выделена new[].

shaved - это просто переменная, содержащая адрес памяти. Вы передаете этот адрес памяти delete[], чтобы избавиться от памяти. shaved содержит адрес памяти памяти, который был выделен new[].

Смежные вопросы