Деструктор на const char *

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

    const char * str  = getStr();

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

4 ответов


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

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

затем не должен вызовов удалить.

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 on str не имеет никакого эффекта.

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


все зависит от того, какой getStr() делает. Может быть, вам даже придется позвонить free на указателе if 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");
}

в этом случае вам нужно будет позвонить plain old delete по указателю возвращается:

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

In в этом случае вам нужно будет позвонить delete [] по указателю возвращается:

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

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


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

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

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


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

delete[] str;
str = null;