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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2015, 19:05   #1
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию C++ освоббождение памяти

Здравствуйте! В конструкторе копирования проверка if (arg != NULL) всегда возвращает истину, почему? Нужно проверить был ли заполнен массив ранее, если да, то освободить память.
Код:
class Calc{	
private:
	float  *arg, *value;
	int n;  
	double start,end, step;	
	void setCalculate ();
              Calc(): start(0), end(0), step(0), arg(NULL), value(NULL), n(0){}; 
	Calc(const Calc& s);
	Calc(double st, double en, double stp);   
	~Calc();    
};

Calc::Calc(const Calc& s)   //конструктор копирования
{
	start = s.start;
	end = s.end;
	step = s.step;
	n = s.n;
	cout << s.arg[0];
	if (arg != NULL)
	{
		cout <<"sdfsdf";
		delete[] arg;
	}
	//if (value!=NULL)
//	delete[] value;
	arg = new float[n+1];
	for (int j=0; j<=n; j++)
	{
		arg[j] = s.arg[j];
		cout <<"\n" << arg[j] << s.arg[j];
	}
	value = new float[n+1];
	for (int j=0; j<=n; j++)
	{
		value[j] = s.value[j];
	}
	
}

Calc::~Calc()
{
	if (arg!=NULL)
		delete[] arg;
	if (value!=NULL)
		delete[] value;

}

Последний раз редактировалось Uefa; 14.05.2015 в 07:05.
Uefa вне форума Ответить с цитированием
Старый 13.05.2015, 19:07   #2
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию

в конструкторе копирования проверка if (arg != NULL) всегда возвращает истину, почему? Нужно проверить был ли заполнен массив ранее, если да, то освободить память.
Uefa вне форума Ответить с цитированием
Старый 13.05.2015, 19:57   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Откуда в конструкторе возмутся данные для освобождения?
Ключевое слово - конструктор. Для чего служат конструкторы?
waleri вне форума Ответить с цитированием
Старый 13.05.2015, 20:00   #4
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Откуда в конструкторе возмутся данные для освобождения?
Ключевое слово - конструктор. Для чего служат конструкторы?
конструктор копирования используется для копирования данных из одного объекта класса в другой. Если есть указатель, под который ранее была выделена динамическая память, эту память нужно освободить, иначе произойдет утечка памяти.
Uefa вне форума Ответить с цитированием
Старый 13.05.2015, 20:20   #5
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

Цитата:
Сообщение от Uefa Посмотреть сообщение
конструктор копирования используется для копирования данных из одного объекта класса в другой.
Чем является конструктор? Это метод, который инициализирует объект, объект, который еще не был создан. Что можно скопировать в то, чего еще нет?
Данная проверка:
Код:
if (arg != NULL)
	{
		cout <<"sdfsdf";
		delete[] arg;
	}
не имеет смысла, т.к. объект еще не был инициализирован, и указатель ссылается на некую область памяти, которая может содержать что угодно, отсюда и истинность проверки.
Цитата:
Если есть указатель, под который ранее была выделена динамическая память, эту память нужно освободить, иначе произойдет утечка памяти.
Это утверждение ближе к operator=(). Т.к. объект был уже создан, и для его полей возможно была выделена память.
halcyon вне форума Ответить с цитированием
Старый 13.05.2015, 20:49   #6
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию

Цитата:
Сообщение от halcyon Посмотреть сообщение
Чем является конструктор? Это метод, который инициализирует объект, объект, который еще не был создан. Что можно скопировать в то, чего еще нет?
Данная проверка:
Код:
if (arg != NULL)
	{
		cout <<"sdfsdf";
		delete[] arg;
	}
не имеет смысла, т.к. объект еще не был инициализирован, и указатель ссылается на некую область памяти, которая может содержать что угодно, отсюда и истинность проверки.

Это утверждение ближе к operator=(). Т.к. объект был уже создан, и для его полей возможно была выделена память.
https://ru.wikipedia.org/wiki/%CA%EE...E2%E0%ED%E8%FF
Uefa вне форума Ответить с цитированием
Старый 13.05.2015, 21:17   #7
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

Цитата:
Сообщение от Uefa Посмотреть сообщение
В чем смысл приведенной ссылки?
Как, намекнул уважаемый waleri, ключевое слово здесь конструктор, что делают конструкторы? Что-то конструируют, помимо конструирования, по-умолчанию этот конструктор еще выполняет побитовое копирование объекта, если программист не переопределяет это поведение собственным конструктором копирования. Как и указано по ссылке:
Цитата:
Существует четыре случая вызова конструктора копирования:

Когда объект является возвращаемым значением
Когда объект передается (функции) по значению в качестве аргумента
Когда объект конструируется на основе другого объекта (того же класса)
Когда компилятор генерирует временный объект (как в первом и втором случаях выше; как явное преобразование и т. д.)
Во всех четырех случаях объект создается, так какой по-вашему смысл проверять внутренние указатели объекта, которой еще только создается?
halcyon вне форума Ответить с цитированием
Старый 14.05.2015, 07:10   #8
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию

Разобрался, теперь программа работает нормально, но при завершении вылазит ошибка _Block_Type_Is_Valid (pHead->nBlockUse). Ошибка в деструкторе из-за освобождения памяти, но что я там не правильно освобождаю, не пойму. В конструкторе выделяю память arg = new float[n+1], в деструкторе освобождаю delete[] arg; В чем ошибка?
Uefa вне форума Ответить с цитированием
Старый 14.05.2015, 09:10   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Кофейная гуща закончилась...
Либо arg изменился либо вызываете delete [] arg более одного раза.
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Памяти VladimirAvakov Общие вопросы C/C++ 0 28.05.2014 23:01
Задача-найти объем оперативной памяти по шестнадцатеричному адресу последнего байта оперативной памяти Ksana Alex Помощь студентам 4 14.11.2013 15:51
Распределение памяти. Динамическое выделение памяти с++ Tolian92 Помощь студентам 8 14.05.2012 21:44
Программа для тестирования памяти, тестирование ячеек памяти Hunter557 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 30.01.2011 19:20
Кольцевая очередь на массиве в статической памяти с элементами в динамической памяти ]tach[ Общие вопросы C/C++ 1 19.01.2011 13:16