Ошибка сегментации при использовании STL - PullRequest
0 голосов
/ 10 августа 2011

У меня проблема с использованием библиотеки 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();
}

Спасибо заранее. Привет

Ответы [ 3 ]

3 голосов
/ 10 августа 2011

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

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

2 голосов
/ 10 августа 2011

Ваш конструктор new2 помещает копию временного объекта в вектор tp2.

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

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

0 голосов
/ 10 августа 2011

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

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

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

...