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 ;
}