Тема: std::vector
Показать сообщение отдельно
Старый 29.01.2006, 02:22     # 1
Crazy_kettle
Junior Member
 
Регистрация: 13.05.2004
Сообщения: 128

Crazy_kettle Известность не заставит себя ждатьCrazy_kettle Известность не заставит себя ждать
std::vector

возникли у меня проблемы с использованием класса vector из стандатрной библиотеки.
Компилятор MS Visual Studio .Net при выполнении следующего фрагмента:
Код:
#include <stdlib.h>
#include <iostream>
#include <conio.h>

using std::vector;
using std::cout;
using std::endl;

struct TS{
	char* str;
	int len;
	TS():str(0),len(0){}
	~TS(){
		free(str);
		str=0;
	}
};
int main(){
	TS s;	
	vector<TS> vec;
	char* temp="This is string";
	s.len=strlen(temp);
	s.str=static_cast<char*>(malloc(s.len+1));
	strcpy(s.str,temp);
	cout<<s.str<<'\n';
	vec.push_back(s);
	cout<<(s.str==0)<<'\t'<<s.str<<'\n';
	TS& el=vec.back();
	cout<<(el.str==s.str)<<'\t'<<el.str<<endl;
	s.str=0;//Чтобы деструктор не пытался освободить память повторно.
	return 0;
}
выдаёт (к тому же возникает какая-то ошибка):
Код:
This is string
0       8RD
1       8RD
Причём, если убрать из структуры TS дескриптор, то выполняется на ура.
Только вот не пойму, причём здесь деструктор может быть причастен, ведь переменная s и вектор vec ещё используются (не говоря уже об области видимости)? Более того, как для переменной s, так и для vec.back(), он явно не вызывался, т.к. s.str==vec.back().str!=0.
Может, у кого идеи есть по поводу этой проблемы.

P.s. Такая "ботва" была обнаружена при отладке написанной программы, где такой подход был использован для того, чтобы при вызове vec.clear() автоматически освобождалась занятая память и при этом избежать "ненужных" выделений памяти и копирования. Вопрос 2: Что делать? Изменять char* на string не хочется, ибо нужно будет очень много править (везде идёт работа с C-строками). Конечно, можно, убрать деструктор и перед вызовом vec.clear() производить "чистку" или ввести новый класс
Код:
class myvector: public vector<TS>{
public:
	void clear(){
		for (int i=0;i<size();i++)
			free((*this)[i].str);
		vector<TS>::clear();
	}
};
Может у вас есть более изящные предложения?

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