Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > operator+, operator=


Автор: Sheff_as_Guest 30.7.2004, 18:48
Доброе утро/день/ночь.
Такая вот у меня проблема: пишу класс для работы со строками и в нём естественно должно быть сложение строк, вот часть кода:
Код
CStr& operator+ (const char* val)
{
 CStr *result=new CStr;
 char *pBuf=new char[strlen(val)+strlen(buffer)+1];
 strcpy(pBuf,buffer);
 strcat(pBuf,val);
 result->buffer=pBuf;
 return *result;
}
CStr& operator= (const CStr& val)
{
 if (this == &val) return *this;

 delete[] buffer;

 buffer = new char[strlen(val.buffer)+1];
 strcpy(this->buffer,val.buffer);
 
 return *this;
}

Но почему-то при компиляции этого кода дебагер рапортирует об утечках памяти. Я проанализировал код, у меня после того как вызывается operator+ создаётся временный объект result, который потом передаётся в operator= и оттуда берётся значение buffer, но только вот сам этот временный объект не удаляется, хотя деструктор в моём классе есть...
Конечно, можно самому удалить этот объект в методе operator=, но только вот откуда программа будет знать что ей передаётся: временный объект result или другой объект типа CStr. Помогите кто чем может.

Автор: lynx_916 30.7.2004, 22:24
по-пойму надо написать деструктор ВЕЗДЕ.
а можноль посмотреть твой класс?
но вопросы возникают и так.

Цитата
delete[] buffer;

чей буфер удаляем? smile.gif
Цитата
char *pBuf=new char[strlen(val)+strlen(buffer)+1];

опять же: чей буфер?.
ведь, насколько я понял, буфер-член класса.
Цитата
this->buffer

вот.
smile.gif

Автор: Sheff_as_Guest 30.7.2004, 23:11
Как чей буффер удаляем, свой, т.е текущего класса, buffer - член класса.
Смотреть на класс не к чему, обычный класс строки, он просто мне нужен для того чтобы MFC не юзать, кстати делал по шаблону CString, не пашет чё то, снова memory leak sad.gif

Автор: Fantasist 30.7.2004, 23:33
Цитата
CStr& operator+ (const char* val)
{
CStr *result=new CStr;
char *pBuf=new char[strlen(val)+strlen(buffer)+1];
strcpy(pBuf,buffer);
strcat(pBuf,val);
result->buffer=pBuf;
return *result;
}


Так не пойдет. Ты нигде не вызываешь delete для result, а следовательно у тебя никогда не будет освобождена из под него память. Делай так:


Цитата
CStr operator+ (const char* val)
{
CStr result;
char *pBuf=new char[strlen(val)+strlen(buffer)+1];
strcpy(pBuf,buffer);
strcat(pBuf,val);
result.buffer=pBuf;
return result;
}


Автор: Sheff_As_Guest 30.7.2004, 23:57
Fantasist
Самое интересное что и так не получается, я сам не понимаю почему, ведь вроде всё как надо...

Автор: Sheff_as_Guest 31.7.2004, 09:54
Люди, ну неужели никто не знает что делать, я с этим вот уже целый день сижу, ничего не выходит, вместо того чтобы прогу продолжать писать я этой ерундой занимаюсь, казалось бы так просто, а не получается sad.gif

Автор: lynx_916 31.7.2004, 16:21
Цитата
Цитата
CStr operator+ (const char* val)
{
CStr result;
char *pBuf=new char[strlen(val)+strlen(buffer)+1];
strcpy(pBuf,buffer);
strcat(pBuf,val);
result.buffer=pBuf;
return result;
}

всё равно резалт надо удалить.

Автор: Sheff_as_Guest 31.7.2004, 21:32
Усё, я сделал!
Проблема была вот в чём, у меня в классе не было Copy-конструктора, поэтому и не пахало, щас всё ok.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)