Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2013, 07:49   #1
OktXIV
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 18
По умолчанию Временные объекты в выражениях

Есть класс:

***********************************
class SomeClass
{
public:
SomeClass(): m_char(new char[2])
{
}

~SomeClass()
{
delete [] m_char;
}

SomeClass& operator+(const SomeClass& sc)
{
SomeClass* _sc_ptr =NULL;
_sc_ptr =new SomeClass;
// какие-то действия с m_char
return *_sc_ptr;
}

operator char*()
{
return m_char;
}

protected:
char* m_char;
};

***********************************

В программе:

***********************************
int main()
{
SomeClass sc1;
SomeClass sc2;
SomeClass sc3;

printf("%s", sc1 + sc2 + sc3);
}

***********************************

Конструктор вызывается 5 раз: для sc1, sc2, sc3, два раза в операциях сложения. Деструктор вызывается только три раза (для sc1, sc2, sc3). Я так понимаю происходит утечка памяти.


==========
==========

Я пробовал сделать так:

***********************************
SomeClass& operator+(const SomeClass& sc)
{
SomeClass _sc_ptr;
// какие-то действия с m_char
return SomeClass(_sc_ptr);
// Соответствующий конструктор тоже дописывал
}

***********************************

Необходимый конструктор:

***********************************
SomeClass::SomeClass(const SomeClass& sc)
{
m_char =new char[2]
// копирование m_char
}

***********************************

В этом случае выдает ошибку: Invalid allocation size 4294967295 bytes

Как сделать чтобы выражение "sc1 + sc2 + sc3" создавало временные объекты которые сами уничтожаются? Подскажите в каком направлении мне искать информацию.
OktXIV вне форума Ответить с цитированием
Старый 18.06.2013, 08:27   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

В вашем operator+ вы возвращаете ссылку на временный объект, который после выхода из operator+ уничтожается.

Переделайте
SomeClass& operator+(const SomeClass& sc)
на
SomeClass operator+(const SomeClass& sc)
waleri вне форума Ответить с цитированием
Старый 18.06.2013, 17:28   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Теперь попробуй вот так:

Код:
SomeClass operator+(const SomeClass& sc){  return SomeClass(); }
_Bers вне форума Ответить с цитированием
Старый 20.06.2013, 05:42   #4
OktXIV
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 18
По умолчанию

Благодарю.
OktXIV вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты ИльназВ C# (си шарп) 13 22.11.2012 19:00
Проверить правильность расстановки круглых и квадратных скобок в выражениях tarasman11 Паскаль, Turbo Pascal, PascalABC.NET 13 06.07.2012 11:50
Временные классы Granus Общие вопросы C/C++ 23 02.06.2011 11:10
Что означает isU в регулярных выражениях sergeiqwe PHP 2 28.05.2010 11:49
Кириллица в регулярных выражениях alx PHP 27 01.03.2008 19:07