C++, выделяющий динамическую память в функции - вопрос о новичке

Я исследую утечку памяти и от того, что я вижу, проблема похожа на это:

int main(){
    char *cp = 0;
    func(cp);
    //code
    delete[] cp;
}

void func(char *cp){
    cp = new char[100];
}

В//комментарий к коду, я ожидал, что CP укажет на выделенную память, но это все еще - нулевой указатель, означающий, что я никогда не удаляю память. Что я делаю wroing?

10
задан 18 January 2010 в 07:32
поделиться

6 ответов

void func(char *cp){
    cp = new char[100];
}

В этой функции char * cp - это « указатель , передаваемый копией », что означает, что они указывают на тот же адрес памяти, но это не тот же указатель . Когда вы меняете указатель внутри, заставляя его указывать куда-то еще, исходный переданный указатель будет продолжать указывать на 0.

13
ответ дан 3 December 2019 в 13:51
поделиться

Вы назначаете cp значение выделенной памяти. Однако это переменная в стеке: копия cp в main! cp является локальным для функции, в которой вы работаете.

Вам нужна ссылка:

void func(char *& cp)

Это будет псевдоним cp , который будет переданным параметром.

18
ответ дан 3 December 2019 в 13:51
поделиться

Параметр cp является локальной переменной функции - его изменение ничего не меняет вне функции. Лучший способ написать функцию:

char * func(){
    return new char[100];
}

И не делать напрямую с вашим вопросом, но вам, вероятно, следует использовать std :: string и std :: vector, а не динамически выделяемые массивы.

6
ответ дан 3 December 2019 в 13:51
поделиться

Вы передаете cbuf , а не cp .

1
ответ дан 3 December 2019 в 13:51
поделиться

Функция изменяет только КОПИЮ cp . Вместо этого используйте ссылку.

1
ответ дан 3 December 2019 в 13:51
поделиться

Как упоминали GMan и Neil, для работы вам нужно будет изменить func на:

char * func ( );

или void func (char * & p);

, которые решат вашу непосредственную проблему.

Однако существует проблема обслуживания. В любом случае func возвращает указатель. Пользователю func непонятно, что возвращаемый указатель должен быть удален. По этой причине обычно избегайте этой конструкции, если не требуется 100%. Скорее:

  1. Помогите пользователю выделить правильный объем памяти, который затем можно передать функции func.
  2. Используйте объект для хранения выделенной памяти. Затем объект может удалить массив символов при его разрушении.

Итак, для кода C ++ я бы рекомендовал:


class CBuf
{
public
    CBuf() 
    {
        iBuf = new char[100];
    }
    ~CBuf
    {
        delete[] iBuf;
    }
    char* func()
    {
        //do stuff;
        return iBuf;
    }
private:
    char* iBuf;
};

int main()
    {
    CBuf cb;
    char* mychar = cb.func();
    //do stuff with character array

    //destructor gets called here because cb goes out of scope
    }

Однако, особенно в программировании на C, может быть 100% необходимость иметь некоторую функцию сортировки для создания массива . Поэтому в программировании на C вы можете заменить деструктор на функцию CreateCBuf и DestroyCBuf . Таким образом, пользователь вашей библиотеки будет знать, что возвращаемый буфер необходимо уничтожить.

возможно, на 100% потребуется какая-то функция сортировки для создания массива. Поэтому в программировании на C вы можете заменить деструктор на функцию CreateCBuf и DestroyCBuf . Таким образом, пользователь вашей библиотеки будет знать, что возвращаемый буфер необходимо уничтожить.

возможно, на 100% потребуется какая-то функция сортировки для создания массива. Поэтому в программировании на C вы можете заменить деструктор на функцию CreateCBuf и DestroyCBuf . Таким образом, пользователь вашей библиотеки будет знать, что возвращаемый буфер необходимо уничтожить.

0
ответ дан 3 December 2019 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: