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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2015, 13:55   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Проблема со стандартным копировщиком

Всем доброго дня !

Столкнулся с пакостным явлением.

Почему стандартный конструктор копирования не работает с данными

класса хранящимися в динамической памяти ?

_________________

cуть проблемы такова :

в функцию function_1() передаю обьект как значение.

обьект D класса Vita имеет тот-же адрес в указателе х , что и

обьект А класса Vita функции main().

при выходе из функции function_1() ячейка по адресу в х освобождается.

при выходе из функции main() ячейка по адресу в х повторно

освобождается, что вызывает ошибку.



Код:
#include <stdio.h>
#include <conio.h>

class Vita

{

private:

	int *x;

public:

	Vita() : x(new int(0)) {printf("\nKONSTRUKTOR 1 %p x = %p\n",this,x);}

	Vita(int a) : x(new int(a)) {printf("\nKONSTRUKTOR 2 %p x = %p\n",this,x);}

	~Vita() 
	
	{
		printf("\nDESTRUKTOR %p x = %p\n",this,x);

		delete x;
	}

	int fvf() const {printf("\nfvf() %p x = %p\n",this,x); return *x;}

	void hgh(int a) const {printf("\nhgh(int a) %p x = %p\n",this,x); *x = a;}
};

void function_1(Vita);


int main()

{
	Vita A(600);

	printf("\nA = %p\n",&A);

	printf("\nA = %d\n",A.fvf());
	
	function_1(A);

	printf("\nA = %d\n",A.fvf());

	getch();

	return 0;
}



void function_1(Vita D)

{
	printf("\nfunction_1() D = %d %p\n",D.fvf(),&D);

	D.hgh(23);
}
RAFA91 вне форума Ответить с цитированием
Старый 13.07.2015, 14:17   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Цитата:
Почему стандартный конструктор копирования не работает с данными
класса хранящимися в динамической памяти ?
А почему должен? Он по стандарту простейший побайтовый копировальщик. Есть значение указателя - он его скопировал, а что там и где не его дело.
p51x вне форума Ответить с цитированием
Старый 13.07.2015, 14:23   #3
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А почему должен? Он по стандарту простейший побайтовый копировальщик. Есть значение указателя - он его скопировал, а что там и где не его дело.
так что - единственный вариант , это писать свой копировщик и

оператор = ?
RAFA91 вне форума Ответить с цитированием
Старый 13.07.2015, 14:28   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
единственный вариант
Да.

<десять символов>
waleri вне форума Ответить с цитированием
Старый 13.07.2015, 15:11   #5
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

написал оператор =

что лучше посоветуете применять

Код:
*x = rhs.fvf();
или
Код:
*x = *(rhs.x);
???

Код:
Vita & operator = (const Vita &rhs)

	{
               if (this == &rhs) return *this;

		*x = rhs.fvf();

		//*x = *(rhs.x);

		return *this;
	}
RAFA91 вне форума Ответить с цитированием
Старый 13.07.2015, 17:29   #6
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Код:
*x = rhs.fvf();
Нифига не читабельно.

Код:
               if (this == &rhs) return *this;

		*x = rhs.fvf();

		//*x = *(rhs.x);

		return *this;
Я бы не советовал плодить return'ы на ровном месте.
Код:
if (this != &rhs)
и дальше по тексту.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
crazy horse вне форума Ответить с цитированием
Старый 14.07.2015, 13:16   #7
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от crazy horse Посмотреть сообщение
Код:
*x = rhs.fvf();
Нифига не читабельно.

[

что по Вашему тогда читабельно ?
RAFA91 вне форума Ответить с цитированием
Старый 14.07.2015, 13:17   #8
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Код:
*x = *(rhs.x);
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
crazy horse вне форума Ответить с цитированием
Старый 14.07.2015, 13:18   #9
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

значит так и напишу.
RAFA91 вне форума Ответить с цитированием
Старый 16.07.2015, 10:47   #10
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
Я бы не советовал плодить return'ы на ровном месте.
Как тогда вернуть из функции:
Код:
Vita & operator = (const Vita &rhs)
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со стандартным графическим модулем dbrf Помощь студентам 1 18.01.2015 21:56
Вопрос по стандартным контейнерам monnzz Общие вопросы C/C++ 3 31.03.2013 02:55
Графика по стандартным алгоритмам Kovy Помощь студентам 2 23.01.2011 13:08
Вопрос по стандартным фукциям. Klim Bassenger Microsoft Office Excel 4 17.08.2009 20:07
Работа со стандартным help'ом Гришас Помощь студентам 4 21.03.2007 16:07