Я относительно новичок, когда дело доходит до 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[]
.
Чтобы предотвратить утечку, я хочу освободить память, хранящуюся «бритой», которая будет использоваться снова после того, как она пройдет через некоторые аргументы. Вероятно, есть веская причина, почему это ограничено, но должен быть какой-то способ освободить память, поскольку в этой конфигурации нет доступа к исходному владельцу (указателю) данных.
Где используется ваш «оригинальный» буфер? Предполагается ли 'cstr' быть« оригинальным »? – mch
В чем проблема, с которой вы сталкиваетесь? Есть ли ошибка компилятора? Помимо неправильных имен переменных, и я не понимаю, что вы пытаетесь выполнить с помощью «бритья», в чем проблема? Если вы серьезно относитесь к использованию C++, вы должны использовать 'std :: string', а не' char * ', и просто избегайте всего этого управления памятью. – mch
И стоит ли cstrn быть cstr? –