Я относительно новичок, когда дело доходит до 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[]
.
Чтобы предотвратить утечки, я хочу освободить память, хранящуюся в 'shaved', чтобы использовать ее снова после прохождения некоторых аргументов. Вероятно, есть веская причина, почему это ограничено, но должен быть какой-то способ освободить память, так как в этой конфигурации нет способа получить доступ к первоначальному владельцу (указателю) данных.