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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2010, 21:39   #1
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию Динамическая память и деструктор

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

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

using namespace std;

class mas
{
	int size;
	int *p;
public:
	mas(){};
	mas(const mas & a);
	mas(int s)
	{
		p = new int [s];
		size = s;
	}

	int GetSize()
	{
		return size;
	}

	void PutMas(int i);
	int GetMas (int i);

	~mas()
	{
		delete [] p;
		size = 0;
	}
};

mas::mas(const mas &a)
{
	p = new int [a.size];
	for (int i = 0; i < a.size; i++)
		*(p+i) = *(a.p+i);
}

void mas::PutMas(int i)
{
		*(p+i) = i;
}

int mas::GetMas(int i)
{
	return *(p+i);
}
void main ()
{
	setlocale (0,"");
	mas a(10);
	mas b;
	mas c;
	

	for (int i = 0; i<10; i++)
		a.PutMas(i);

	b = a;
	c = b;

cout<<"c = ";
	for (int i = 0; i<10; i++)
	{
	cout<<c.GetMas(i)<<" ";}
	cout<<"\na = "<<a.GetSize()<<"\n";
	cout<<"b = "<<b.GetSize()<<"\n";
	cout<<"c = "<<c.GetSize()<<"\n";
	
	a.~mas();
	b.~mas();
	c.~mas();
	cout<<"\na = "<<a.GetSize()<<"\n";
	cout<<"b = "<<b.GetSize()<<"\n";
	cout<<"c = "<<c.GetSize()<<"\n";


	getch();
}
JeyKip вне форума Ответить с цитированием
Старый 28.10.2010, 00:50   #2
__Demon__
Пользователь
 
Аватар для __Demon__
 
Регистрация: 13.08.2009
Сообщений: 37
По умолчанию

Не следует использовать явного вызова деструктора класса. После вызова деструктора, объект для которого он вызван нельзя использовать, т.к. в память где раньше находился объект может быть записано что угодно. Я предлагаю вместо явного вызова деструктора создать и использовать функцию класса, которая будет освобождать динамическую память и присваивать укзателю 0, а также добавить проверку попытки обращения к несуществующим данным по ложному указателю. Да, кстати, использовать неперегруженный оператор "=" с объектами работающими с динамической памятью нельзя, т.к. такое побитовое копирование по умолчанию может привести к ошибкам.

Последний раз редактировалось __Demon__; 28.10.2010 в 00:52.
__Demon__ вне форума Ответить с цитированием
Старый 28.10.2010, 01:04   #3
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию

но дело в том, что мне нужно, чтобы память, выделенная под все эти объекты, освобождалась перед выходом...не пойму, почему, если конструктором инициализации проинициализировать объект, то под него выделяется отдельная область памяти, а если конструктором копирования, то пишет в одну и ту же область памяти...??
JeyKip вне форума Ответить с цитированием
Старый 28.10.2010, 16:29   #4
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию

в общем вот, код, демонстрирующий работу трех видов конструкторов, перегрузку присваивания, и удаление динамически выделенной памяти в различных случаях..!! может кому пригодится...!!!

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

using namespace std;

class mas
{
	int size;
	int *p;
public:
	mas(){};
	mas & operator = (mas & a);
	void Destroy();
	mas(const mas & a);

//конструктор инициализации
	mas(int s)
	{
		p = new int [s];
		size = s;
	}
//количество элементов в массиве (источнике)
	int GetSize()
	{
		return size;
	}

	void PutMas(int i);
	int GetMas (int i);
//деструктор
	~mas()
	{
		Destroy();
	}
};

//перегруженный конструктор копирования
mas::mas(const mas &a)
{
	p = new int [a.size];
	for (int i = 0; i < a.size; i++)
		*(p+i) = *(a.p+i);
	size = a.size;
}
//перегрузка оператора присваивания
//копирование всех элементов из одного массива в другой
mas & mas::operator =(mas &a)
{
	p = new int [a.size];
	for (int i = 0; i < a.size; i++)
		*(p+i) = *(a.p+i);
	size = a.size;
	return *this;
}
//метод освобождения динамически выделенной памяти
void mas::Destroy()
{
	if (size > 0)
	{
		delete [] p;
		size = 0;
	}
}
//заполнение массива
void mas::PutMas(int i)
{
		*(p+i) = i;
}
//возвращение элемента массива
int mas::GetMas(int i)
{
	return *(p+i);
}
void main ()
{
	setlocale (0,"");
	mas a(10);//вызов конструктора инициализации
	mas c;

	for (int i = 0; i<10; i++)
		a.PutMas(i);
	//конструктор копирования
    mas b = a;
	//перегруженный знак присваивания
	c = b;

	cout<<"c = ";
	for (int i = 0; i<10; i++)
	{
	cout<<c.GetMas(i)<<" ";}
	cout<<"\na = "<<a.GetSize()<<"\n";
	cout<<"b = "<<b.GetSize()<<"\n";
	cout<<"c = "<<c.GetSize()<<"\n";

	//вызов метода освобождения выделенной памяти
	a.Destroy();
	//деструктор, содержащий метод Destroy()
	b.~mas();
	c.~mas();
	//вывод количества объектов массивов после освобождения памяти
	cout<<"\na = "<<a.GetSize()<<"\n";
	cout<<"b = "<<b.GetSize()<<"\n";
	cout<<"c = "<<c.GetSize()<<"\n";
	getch();
}
JeyKip вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая память zhenya.ya Помощь студентам 1 22.09.2010 08:43
Динамическая память Astat Помощь студентам 1 30.06.2010 20:40
Динамическая память PaulSev Общие вопросы Delphi 12 25.03.2010 09:07
динамическая память zhenya.ya Помощь студентам 2 24.02.2010 20:58
Динамическая память liver1981 Общие вопросы C/C++ 5 22.04.2009 09:16