Я исследую утечку памяти и от того, что я вижу, проблема похожа на это:
int main(){
char *cp = 0;
func(cp);
//code
delete[] cp;
}
void func(char *cp){
cp = new char[100];
}
В//комментарий к коду, я ожидал, что CP укажет на выделенную память, но это все еще - нулевой указатель, означающий, что я никогда не удаляю память. Что я делаю wroing?
void func(char *cp){
cp = new char[100];
}
В этой функции char * cp - это « указатель , передаваемый копией », что означает, что они указывают на тот же адрес памяти, но это не тот же указатель . Когда вы меняете указатель внутри, заставляя его указывать куда-то еще, исходный переданный указатель будет продолжать указывать на 0.
Вы назначаете cp
значение выделенной памяти. Однако это переменная в стеке: копия cp
в main! cp
является локальным для функции, в которой вы работаете.
Вам нужна ссылка:
void func(char *& cp)
Это будет псевдоним cp
, который будет переданным параметром.
Параметр cp является локальной переменной функции - его изменение ничего не меняет вне функции. Лучший способ написать функцию:
char * func(){
return new char[100];
}
И не делать напрямую с вашим вопросом, но вам, вероятно, следует использовать std :: string и std :: vector, а не динамически выделяемые массивы.
Функция изменяет только КОПИЮ cp
. Вместо этого используйте ссылку.
Как упоминали GMan и Neil, для работы вам нужно будет изменить func на:
char * func ( );
или void func (char * & p);
, которые решат вашу непосредственную проблему.
Однако существует проблема обслуживания. В любом случае func возвращает указатель. Пользователю func непонятно, что возвращаемый указатель должен быть удален. По этой причине обычно избегайте этой конструкции, если не требуется 100%. Скорее:
Итак, для кода 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
. Таким образом, пользователь вашей библиотеки будет знать, что возвращаемый буфер необходимо уничтожить.
CreateCBuf
и DestroyCBuf
. Таким образом, пользователь вашей библиотеки будет знать, что возвращаемый буфер необходимо уничтожить. возможно, на 100% потребуется какая-то функция сортировки для создания массива. Поэтому в программировании на C вы можете заменить деструктор на функцию CreateCBuf
и DestroyCBuf
. Таким образом, пользователь вашей библиотеки будет знать, что возвращаемый буфер необходимо уничтожить.