Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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


Ответ
 
Опции темы
Старый 08.07.2010, 23:50   #1
kostyan777
 
Регистрация: 11.06.2010
Сообщений: 5
Вопрос Адрес переменной

Не могу понять: почему если я в методе (перегруженный оператор сложения) создал объект и возвращаю его, то в блоке описания метода у объекта адрес один, а когда метод возвращает этот объект уже в блоке main - этот объект уже имеет другой адрес? Может кто подскажет?

void Fill(int *&a)
{
delete []a;
int size=0;
cout<<"Введи размер массива"<<endl;
cin>>size;
a=new int[size];
for(int i=0;i<size;i++)
cin>>a[i];
}

void main()
{
int *a=NULL;
Fill(a);
Mas A(a,5), Z(A);
int b[3]={9,2,7};
Mas B(b,3);
Z=A+B;
}

Вот реализация самого метода
Mas Mas:perator +(Mas A) const
{
Mas *REZ=new Mas(*this);
for(int i=0;i<A.size;i++)
{
if(!(*REZ).Contains(A.a[i]))
(*REZ).Add(A.a[i]);
}
return *REZ;
}
kostyan777 вне форума Ответить с цитированием
Старый 09.07.2010, 00:20   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Да у вас течет !
Код:
Mas *REZ=new Mas(*this);
Выделили память.
Код:
return *REZ;
Не очистили её и вернули значение.

А пачиму адреса разные подумайте, вывод настолько логичен, что я даже не знаю как его сформулировать.

Подсказка :
Код:
any some(){
   any olo;
   return olo;
   // вызываются деструкторы переменных
}
...
void some2(){
   any ola = some();
   // вызываются деструкторы переменных
}
...
Что было бы с программой, если бы ola и olo имели один адрес ?
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux

Последний раз редактировалось ozo; 09.07.2010 в 00:26.
ozo вне форума Ответить с цитированием
Старый 09.07.2010, 11:15   #3
kostyan777
 
Регистрация: 11.06.2010
Сообщений: 5
По умолчанию

Может я не правильно понял работу с выделением памяти?
Ведь если бы я просто объявил переменную (Mas A), при выходе из блока вызывается диструктор и до этой области памяти не достучаться. А когда я выделяю память динамически с помощью new, и в этой области памяти вся информация должна сохраняться и указатель на эту область должен передаться как результат функции через return.
kostyan777 вне форума Ответить с цитированием
Старый 09.07.2010, 11:49   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,570
По умолчанию

Цитата:
Сообщение от kostyan777 Посмотреть сообщение
Может я не правильно понял работу с выделением памяти?
Ведь если бы я просто объявил переменную (Mas A), при выходе из блока вызывается диструктор и до этой области памяти не достучаться. А когда я выделяю память динамически с помощью new, и в этой области памяти вся информация должна сохраняться и указатель на эту область должен передаться как результат функции через return.
Так возвращается же из оператора не указатель, а объект (копия объекта, на который указывает REZ).
pu4koff на форуме Ответить с цитированием
Старый 11.07.2010, 21:16   #5
kostyan777
 
Регистрация: 11.06.2010
Сообщений: 5
Сообщение

Переделал прогу, все заработало, но теперь проблема с указателем (члены класса указатель на массив int *a и размер массива int size )- когда оператор сложения возвращает результат, то указатель на массив содержит мусор, хотя в блоке оператора сложения указатель имел корректное значение - в чем беда?

Mas Mas:perator +(Mas A) const
{
Mas REZ(*this);
/**/
return REZ;
}

Mas::Mas(const Mas&M)
{
size=M.size;
a=new int[size];
for(int i=0;i<size;i++)
a[i]=M.a[i];
}
kostyan777 вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Адрес переменной: Вопрос Black-Sparkle Общие вопросы C/C++ 11 11.08.2009 13:59
Снова про адрес переменной Pedro Общие вопросы Delphi 2 17.12.2008 21:53
Адрес переменной Pedro Общие вопросы Delphi 11 16.12.2008 13:03
Работа с файлами (создание, удаление, открытие, связываение с переменной, очищение памяти переменной) Arkuz Общие вопросы Delphi 12 25.09.2007 19:47
как узнать ip адрес зная mac адрес Roman Работа с сетью в Delphi 9 25.06.2007 11:39


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS