使用STL时出现分段错误

时间:2011-08-10 06:43:30

标签: c++ stl polymorphism segmentation-fault

我在使用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 个答案:

答案 0 :(得分:3)

正如@UncleBens在评论中写道,New_class违反了rule of three

我个人的建议是不要使用动态分配的属性......

答案 1 :(得分:2)

你的new2构造函数将临时对象的副本推送到tp2向量。

然后销毁临时对象并删除其tp指针。所以向量中的副本现在有一个tp指针,指向已经释放的内存。

你的New_class应该实现一个拷贝构造函数。

答案 2 :(得分:0)

您忘了在New_class上定义复制构造函数和赋值运算符。我们一直都看到这一点。对于新手来说,这是一个基本障碍,它吸引了大多数人。

当您将项添加到向量时,将隐式调用复制构造函数,但编译器生成的版本不适合您的New_class,因此您必须自己编写。

给出其他代码给复制构造函数和赋值运算符提供合理的定义是很困难的,所以我不打算尝试。建议你在一本好的C ++书中阅读它。