2011-08-10 6 views
0

У меня возникла проблема с использованием библиотеки STL. Я прикрепляю фрагмент кода.Ошибка сегментации при использовании STL

// Store a class object in a vector. 
#include <iostream> 
#include <vector> 

using namespace std; 

class Parent{ 
    int id; 
public: 
    Parent(){}; 
    Parent(int x){ id=x;} 
    virtual ~Parent(){ cout<<"Parent"<<endl;} 
    virtual void print3(){cout<<"Printing Parent "<<id;} 
}; 

class Child:public Parent{ 
    int c; 
public: 
    Child(int m,int n):Parent(m){ 
    c=n; 
    } 
    Child(){c=0;} 
    virtual ~Child(){ cout<<"Child"<<endl;} 
    virtual void print3(){cout<<"Printing Child "<<c;} 
}; 

class New_class 
{ 
public: 
    New_class(){ 
    tp=new Child(10,20); 
    } 
    ~New_class(){ 
    delete tp; 
    } 
    void check(Parent &tmp){ 
    tmp.print3(); 
    } 
    void print2(){tp->print3();} 
private: 
    Parent *tp; 

}; 

class New2{ 
    vector<New_class> tp2; 
public: 
    New2(){ 
    tp2.push_back(New_class()); 
    } 
    ~New2(){ 
     tp2.clear(); 
    } 
    void print(){ vector<New_class>::iterator it=tp2.begin(); (*it).print2();} 
}; 

int main() 
{ 
    New2 m ; 
    m.print(); 
} 

Заранее спасибо. С уважением

+0

В чем проблема, с которой вы сталкиваетесь? –

+3

Просто нарушение правила из трех: http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three – UncleBens

+0

@Dean: 'New_class' –

ответ

3

Как @UncleBens написал в комментариях, New_class нарушает rule of three.

Мой личный совет будет не использовать динамически выделенный атрибут ...

+0

Строка 1 - хороший совет. Строка 2 - отличный совет. –

2

Ваш new2 конструктор толкает копию временного объекта на вектор ТР2.

Временный объект затем уничтожается и удаляет указатель tp. Таким образом, копия в векторе теперь имеет указатель tp, который указывает на уже освобожденную память.

Ваш New_class должен реализовать конструктор копирования.

0

Вы забыли указать конструктор копирования и оператор присваивания в своем New_class. Мы видим это все время. Это базовое препятствие для новичков, которое нужно преодолеть, и это улавливает большинство людей.

Конструктор копирования вызывается неявно, когда вы добавляете элемент в вектор, но сгенерированная версия компилятора не подходит для вашего New_class, поэтому вам нужно написать свой собственный.

Трудно дать разумные определения для конструктора копирования и оператора присваивания, учитывая ваш другой код, поэтому я не буду пытаться. Предложите вам прочитать об этом в хорошей книге на C++.

Смежные вопросы