Тема: std::vector
Показать сообщение отдельно
Старый 29.01.2006, 21:47     # 3
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
2 Drakosha.
vec.push_back(s) не создает стековый обьект. push_back в параметре получает константный референс
Код:
void push_back(
   const Type& _Val
);
Именно поэтому и происходит креш, вектор при добавлении элемента плоско копирует структуру. Получается две структуры имееющие указатель на один и тот -же адрес. Это христоматийная ошибка. На таких примерах обычно показывают зачем нужен копи-конструктор. Обьекты помещаемые в стандартные (stl) контейнеры должны иметь копи-конструкторы.


2 Crazy_kettle.
Что-то намешано у тебя и С и С++.
Вектор на самом деле при удалении элемента вызывет для него деструктор.
Попробуй хранить в векторе указатели на структуру TS, а не сами сами структуры, тогда сам сможешь управлять выделением и освобожденим пямяти. То есть что то типа
Код:
struct TS{
	char* str;
	int len;
	TS():str(0),len(0){}
	TS(const char* s) ///нормальный конструктор 
	{
		len = strlen(s);
		str= new char[len+1];
		strcpy(str,s);
	}
	~TS(){
		if(str) 
			delete [] str;
		str=0;
	}
};

int main ()
{
	vector<TS*> vec;
	///Это слишком длинно/////////
	TS* pTS = new TS();//("This is string");
	char* temp="This is string";
	pTS->len = strlen(temp);
	pTS->str = new char [pTS->len+1];
	strcpy(pTS->str,temp);
	/////Проще написать нормальный конструктор и сделать 
	/////так     TS* pTS = new TS("This is string");
	cout<<pTS->str<<'\n';
	vec.push_back(pTS);
	cout<<(pTS->str==0)<<'\t'<<pTS->str<<'\n';
	//запомнить указатель 
	TS* pTS1 = vec.back();
	cout<<(pTS1->str==pTS->str)<<'\t'<<pTS1->str<<endl;
	///освобождение пямяти////////////
	//удалить указатель из вектора 
	vec.pop_back(); /// еще можно так  vec.erase(0) или vec.clear();
	//удалить сам указатель
	delete pTS1 ;

}
__________________
Best Regards

Последний раз редактировалось alexey_ma; 29.01.2006 в 22:06.
alexey_ma вне форума