Удаление не принадлежащего динамического массива через указатель - PullRequest
0 голосов
/ 12 апреля 2010

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

Ответы [ 2 ]

1 голос
/ 12 апреля 2010

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

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

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

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

0 голосов
/ 12 апреля 2010

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

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

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

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

...