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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2011, 19:54   #1
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
Вопрос Проблема: дестуктор и стек

Есть программа... очень длинная и сложная.
В ней есть шаблонный стек, есть свои классы...

при помещении объекта в стек вот так:
Код:
StackPrims.Push(&Prim);
происходит следующее:

В вершине стека оказывается примитив(объект класса примитивов), и с ним все впорядке, а вот сам Prim, имеющий такую структуру:
Код:
class CPrim
{

	int InitFlag;
public:
	int M;
	int N;
	char**v;

	void SetLine(int No, char* Line)
	{
		const char* L = Line;
		strcpy(v[No],L);
	}
	CPrim()
	{
		InitFlag =0;
		M=0;
		N=0;
		v = NULL;
	}
	void PrimValueFree()
	{
		for (int i =0; i<N; i++)
		{
			if ((v!=NULL) && (v[i]!=NULL))
			{
				free(v[i]);
				v[i] = NULL;
			}

		}
		if (v!=NULL) free(v);
		v = NULL;
	}
	void CPrimInit(int m, int n)
	{
		PrimValueFree();
		M=m;
		N=n;
		//v = new (char*)[y];

		v = (char**) malloc(N*sizeof(char*));
		for( int i=0; i < N; i++ ) {
			v[i] = new char[M];
			};
		InitFlag = 1;
	};

	void Print()
	{
		for (int n =0; n< CPrim::N ; n++)
			printf("%s\n", (CPrim::v[n]));

	}
	void PrintLog(FILE *fp)
	{
		for (int n =0; n< CPrim::N ; n++)
			fprintf(fp,"%s\n", (CPrim::v[n]));

	}
	~CPrim()
	{
		if (CPrim::InitFlag)
		{
			for(int i=0; i< N; i++)
			{
					if ((v)&&(v[i])) free(v[i]);
			}
			if(v) free(v);
			CPrim::InitFlag =0;

		}
	};
		void operator = (CPrim other)
	{
			CPrim::PrimValueFree();
			CPrim::M = other.M;
			CPrim::N = other.N;
			CPrim::CPrimInit(other.M,other.N);
			for (int i = 0; i<N; i++)
			{
				const char* t = other.v[i];
				if (!CPrim::InitFlag)
				{
					CPrim::CPrimInit(other.M,other.N);
				}
				strcpy(CPrim::v[i], t);
			}
	}

};
в нем почему - то в значении у v адрес не нулевой, а вот v[0] ссылается на 0xdddddddd, притом остальное все верно... Почему так происходит?

Для верности могу кинуть свой шаблонный стек...
Код:
template <class Type> class STACKEL
{
	public:	
	Type *Value;

	STACKEL<Type>* Next;
	STACKEL()
	{
		STACKEL::Value = new Type;
	}
	~STACKEL()
	{
		delete(Value);
	}

	int SetValue(Type *Val)
	{
		*(STACKEL::Value) = *Val;
		return 0;
	}
};
template <class Type> class CStack
{
	private:
		STACKEL<Type>* Top;

	public:	
		int Count;
		CStack()
		{
			Count =0;
			CStack::Top = NULL;
		}
		int IsEmpty()
		{
			return (CStack::Count==0);
		};
		Type ShowTop();
		STACKEL<Type>* ShowTopAdress();
		STACKEL<Type>* Push(Type*);
		Type Pop();
};

template <class Type> STACKEL<Type>* CStack<Type>::Push(Type *Value)
{
	//STACKEL<Type>* Element = (STACKEL<Type>*) malloc(sizeof(STACKEL<Type>));
	STACKEL<Type>* Element = new STACKEL<Type>;
	Element->Next = CStack::Top;
	//*(Element->Value)=Value;
	Element->SetValue(Value);
	CStack::Top = Element;
	CStack::Count++;
	return Element;
}

template <class Type> Type CStack<Type>::Pop()
{

	Type* Ans = new(Type);
	Ans = CStack::Top->Value;
	if (CStack::Count)
	{
		CStack::Count--;
		STACKEL<Type>* t = CStack::Top;
		CStack::Top = CStack::Top->Next;
		free(t);
	};
	return *Ans;
}

template <class Type> Type CStack<Type>::ShowTop()
{
	return *(CStack::Top->Value);
}

template <class Type> STACKEL<Type>* CStack<Type>::ShowTopAdress()
{
	return CStack::Top;
}
EniOk вне форума Ответить с цитированием
Старый 11.06.2011, 20:11   #2
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

Почему так тема названа - грешу на дестуктор( Но толком непонятно где как и почему происходит потеря ссылки...
EniOk вне форума Ответить с цитированием
Старый 13.06.2011, 20:58   #3
EniOk
Пользователь
 
Аватар для EniOk
 
Регистрация: 07.06.2009
Сообщений: 43
По умолчанию

Эхх... Видимо всем влом... ая просто не понимаю где лагает и что...
EniOk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стек Darknes Общие вопросы C/C++ 2 11.04.2011 23:30
стек freestylerUA Паскаль, Turbo Pascal, PascalABC.NET 2 09.03.2011 13:28
стек Dimarik Общие вопросы C/C++ 3 28.09.2009 22:14
Стек lucky Паскаль, Turbo Pascal, PascalABC.NET 2 12.05.2009 18:35