首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

高分关于智能指针的使用存在的有关问题,

2012-08-16 
高分求助:关于智能指针的使用存在的问题,高手请进!首先我定义了一个简单的类:class Student{private:int s

高分求助:关于智能指针的使用存在的问题,高手请进!
首先我定义了一个简单的类:
class Student
{

private:
int schoolNumber;
string name;
string address;

public:
//默认构造函数
Student():schoolNumber(0){}
//构造函数
Student(int sn,string nm,string add):schoolNumber(sn),name(nm),address(add){ }

void setName(const string nm){name = nm;}
void setAddress(const string add){address = add;}
void setSchoolNo(const int No){schoolNumber = No;}
int getSchoolNo()const {return schoolNumber;};
string getName()const{return name;}
string getAddress()const {return address;}

void display();
//重载输出操作符
friend ostream& operator<<(ostream&,const Student&);
//重载输入操作符
friend istream& operator>>(istream&,Student&);
//重载==操作符
friend bool operator==(const Student&,const Student&);
//重载!=操作符
friend bool operator!=(const Student&,const Student&);
};

其中有一些set和get函数,还重载了一些操作,但是这些操作与我的问题无关,所以就不列出了,只列出display函数:
void Student::display()
{
cout<<schoolNumber<<"\t"<<name<<"\t"<<address<<"\t"<<endl;;
}

然后就是使用智能指针了:


//智能指针
class StdPtr
{

friend class StudentPtr;
//实际的指针
Student *sp;
//引用计数
size_t use;
//构造函数
StdPtr(Student *p):sp(p),use(1){}
//析构函数
~StdPtr(){delete sp;}


};


class StudentPtr
{
public:
//构造函数
StudentPtr(Student *p):ptr(new StdPtr(p)){}
//复制操作符
StudentPtr(const StudentPtr& orig):ptr(orig.ptr){++ptr->use;}
//赋值操作符
StudentPtr& operator=(const StudentPtr&);
//析构函数
~StudentPtr()
{
if(--ptr->use == 0)
  //这里出错
delete ptr;
}
//重载解引和箭头
Student &operator*(){return *ptr->sp;}
Student *operator->(){return ptr->sp;}
private:
StdPtr *ptr;

};

其中赋值构造操作符的定义如下:
//赋值构造操作符
StudentPtr& StudentPtr::operator=(const StudentPtr& rhs)
{
++rhs.ptr->use;
if(--ptr->use == 0)
delete ptr;
ptr = rhs.ptr;
return *this;
}


在主函数中:
int main()
{

Student std1(1,"bird","xust");
StudentPtr ptr1(&std1);
ptr1->display();
return 0;
}
程序可以打印结果,但是return 0时会出错:_block_type_is_valid(pHead->nBlockUse)
经我仔细检查报错发生在StudentPtr的析构函数中的delete语句。但是我怎么也想不明白。
这个程序是我模仿C++primer上的14.6节写的,我从网上下载了它的源代码,运行时也会报错,所以求教高手啊!

[解决办法]

C/C++ code
StudentPtr ptr1(new Student(1,"bird","xust"));
[解决办法]
参考:
动态分配资源的自动释放 - auto_ptr的实现原理

使用auto_ptr需要注意的事项

热点排行