Деструктор на постоянном символе * - PullRequest
8 голосов
/ 14 марта 2011

В моей программе у меня есть такая строка:

    const char * str  = getStr();

Нужно ли вызывать деструктор в str [] в конце функции, чтобы предотвратить утечки памяти?

Ответы [ 4 ]

23 голосов
/ 14 марта 2011

Вопрос не содержит достаточно информации, чтобы сказать, это зависит от того, что делает getStr().Например:

const char *getStr() {
    return "boo";
}

тогда вы не должны вызывать delete.

const char *getStr() {
    return new char;
}

тогда вам следует позвонить delete str;, чтобы избежать утечки памяти (и не должныпозвоните delete[]).

const char *getStr() {
    return new char[10];
}

, затем вы должны позвонить delete[] str;, чтобы избежать утечки памяти (и не должны вызывать delete).

const char *getStr() {
    return 0;
}

тогда это не 'Независимо от того, что вы делаете, вызов любого типа delete для str не имеет никакого эффекта.

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

2 голосов
/ 14 марта 2011

Все зависит от того, что делает getStr().Может даже случиться так, что вам придется вызывать free для указателя, если getStr() создал его с помощью malloc.Может случиться так, что getStr() возвращает указатель на статическую область (не очень поточно-безопасную, но бывает) или любое другое.

Часть контракта и документация для getStr() должны бытькто владеет указателем, тот возвращает.

Вот несколько примеров возможных getStr() функций ...

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

const char *getStr()
{
    static char buf[30] = "Silly counter";

    buf[0] = buf[0] + 1;
    return buf;
}

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

const char *getStr()
{
    return strdup("Silly string");
}

В этом случае вам нужно будет вызвать обычный старый delete для возвращенного указателя:

const char *getStr()
{
    return new char;
}

В этом случае вам нужно будет вызвать delete [] для возвращенного указателя:

const char *getStr()
{
    return new char[50];
}

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

1 голос
/ 14 марта 2011

Это зависит от того, как getStr() был разработан.Он может вернуть указатель на строку, которая все еще принадлежит кому-то другому (и в этом случае ответ отрицательный), или он может вернуть указатель на, и вызывающая сторона становится владельцем (и в этом случае ответ - да).

Вы должны проверить документацию getStr, чтобы узнать.

Если владелец возвращаемой области принадлежит вызывающему, то, вероятно, в C ++ возвращение std::string было бы гораздо лучшей идеей.

0 голосов
/ 14 марта 2011

Это хорошая идея, если она выходит из области видимости.Я бы также рекомендовал установить указатель на ноль, чтобы он не свисал:

delete[] str;
str = null;
...