Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator+, operator=, Проблемы 
:(
    Опции темы
Sheff_as_Guest
Дата 30.7.2004, 18:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Доброе утро/день/ночь.
Такая вот у меня проблема: пишу класс для работы со строками и в нём естественно должно быть сложение строк, вот часть кода:
Код
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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 13.6.2004
Где: Молдова

Репутация: нет
Всего: 1



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

Цитата
delete[] buffer;

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

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

вот.
smile.gif


--------------------
Who dares, wins. (с) Solid Snake
PM MAIL ICQ YIM MSN   Вверх
Sheff_as_Guest
Дата 30.7.2004, 23:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как чей буффер удаляем, свой, т.е текущего класса, buffer - член класса.
Смотреть на класс не к чему, обычный класс строки, он просто мне нужен для того чтобы MFC не юзать, кстати делал по шаблону CString, не пашет чё то, снова memory leak sad.gif
  Вверх
Fantasist
Дата 30.7.2004, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
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;
}




--------------------
Волны гасят ветер...
PM MAIL   Вверх
Sheff_As_Guest
Дата 30.7.2004, 23:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Fantasist
Самое интересное что и так не получается, я сам не понимаю почему, ведь вроде всё как надо...
  Вверх
Sheff_as_Guest
Дата 31.7.2004, 09:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Люди, ну неужели никто не знает что делать, я с этим вот уже целый день сижу, ничего не выходит, вместо того чтобы прогу продолжать писать я этой ерундой занимаюсь, казалось бы так просто, а не получается sad.gif
  Вверх
lynx_916
Дата 31.7.2004, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 13.6.2004
Где: Молдова

Репутация: нет
Всего: 1



Цитата
Цитата
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;
}

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


--------------------
Who dares, wins. (с) Solid Snake
PM MAIL ICQ YIM MSN   Вверх
Sheff_as_Guest
Дата 31.7.2004, 21:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Усё, я сделал!
Проблема была вот в чём, у меня в классе не было Copy-конструктора, поэтому и не пахало, щас всё ok.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0663 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.