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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2012, 22:13   #1
alexey_kip
Форумчанин
 
Регистрация: 19.11.2011
Сообщений: 198
Восклицание

Добрый вечер
Я пишу курсовую и при работе с памятью возникает ошибка (во время работы оператора new). Мучался с ней несколько дней - хоть убей не могу понять в чем причина.
Для простоты уменьшил объем программы до 1 класса. Возникла новая проблема.
Пожалуйста, помогите исправить

Код:
#include <string>
using namespace std;

class CHostel
{
public:
	char *m_Address;
	char *m_District;
	CHostel();
	~CHostel();
	CHostel& operator =(const CHostel &temp);
};

CHostel::CHostel()
{
	m_Address=new char[50];
	m_District=new char[20];
	m_Address[0]=m_District[0]=0;
}
CHostel::~CHostel()
{
	delete[] m_Address;
	delete[] m_District;
}

CHostel& CHostel::operator =(const CHostel& temp)
{
	if(this->m_Address)
		this->~CHostel();
	strcpy(m_Address,temp.m_Address);
	strcpy(m_District,temp.m_District);
	return *this;
}


template <class T>
T* IncMemory(int k, T *var)
{
	if(!k)
	{
		var=new T;
		return var;
	}
	T *t;
	t=new T[k+1];
	int sw=sizeof(T);
	for(int i=0;i<k;i++)
		t[i]=var[i];
	if(k>1)	delete[] var;
	else delete var;
	var=t;
	return var;
}

int numb=0;

void AddHostel(CHostel *m_Hostel)
{
	CHostel temp;
	numb++;
	m_Hostel=IncMemory(numb-1,m_Hostel);
	m_Hostel[numb-1]=temp;
}


void main()
{
	CHostel *m_Hostel=new CHostel;
	AddHostel(m_Hostel);
	AddHostel(m_Hostel);
}
В смысл вдумываться бесполезно, это маленький кусок программы

Ошибка с памятью в этой строке
Код:
t=new T[k+1];
После второго запуска
Код:
AddHostel(m_Hostel);

Последний раз редактировалось Stilet; 18.11.2012 в 12:49.
alexey_kip вне форума Ответить с цитированием
Старый 18.11.2012, 00:25   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Код:
CHostel& CHostel::operator =(const CHostel& temp)
{	
}

template <class T>
T* IncMemory(int k, T *var)
{	
}
попробуйте объяснить. что здесь происходит
counter вне форума Ответить с цитированием
Старый 18.11.2012, 10:08   #3
alexey_kip
Форумчанин
 
Регистрация: 19.11.2011
Сообщений: 198
По умолчанию

Спасибо большое за вопрос, я понял, в чем ошибка благодаря ему, как это ни странно.

Код:
CHostel& CHostel::operator =(const CHostel& temp)
{
	if(this->m_Address)
		this->~CHostel();
	strcpy(m_Address,temp.m_Address);
	strcpy(m_District,temp.m_District);
	return *this;
}
Тут фактически суицид
Код:
if(this->m_Address)
		this->~CHostel();
А потом я туда еще что-то копировать пытаюсь, вот и происходят ошибки с памятью.

А шаблон у меня - что-то вроде функции realloc, только ее работа меня не устроила (из-за ошибки, которую я первоначально описал), поэтому я написал функцию, инкриминирующую память для новой переменной.
alexey_kip вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка в работе с динамической памятью thrashkid Общие вопросы C/C++ 8 30.06.2011 00:48
ошибка при работе с файлом Juffin Общие вопросы Delphi 3 11.04.2009 21:37
Странный баг при работе с разделяемой памятью в C mephisto123 Qt и кроссплатформенное программирование С/С++ 2 01.08.2008 18:10
Ошибка при работе с файлом LeoN Общие вопросы Delphi 1 07.12.2007 15:21
Ошибка при работе с БД malevich БД в Delphi 8 25.11.2007 15:10