谁能看出下面代码的错误之处?重赏100分!
#include <iostream>
using namespace std;
//计数类
class cla_sp{
private:
friend class B;
int *p;
size_t use_count;
cla_sp(int *pa):p(pa),use_count(1){}
~cla_sp(){delete p;}
};
//B类
class B{
public:
B(int *p):ptr(new cla_sp(p)){}//构造函数
B(const B& orign):ptr(orign.ptr){ ++ptr->use_count;//复制构造函数
cout<<"copy constructor"<<endl;}
B& operator=(const B&rB);//赋值操作符
~B(){if(--ptr->use_count==0) delete ptr;//析构函数
cout<<"destructor"<<endl;}
int get_p_val(){return *ptr->p;}
void set_p_val(int i){*ptr->p=i;}
size_t get_useCount(){return ptr->use_count;}
private:
cla_sp* ptr;
};
B& B::operator=(const B& rB){
++rB.ptr->use_count;
if(ptr->use_count==0)
delete ptr;
ptr=rB.ptr;
cout<<"operator="<<endl;
return *this;
}
int main(void)
{
int a=1;
B b1(&a);
B b2(b1);
B b3=b1;
cout<<b2.get_useCount()<<endl;
cout<<b2.get_p_val()<<endl;
return 0;
}
[解决办法]
计数类中,没有指针没有new,怎么能delete? 把delete去掉,或者new个指针出来就能解决,给分吧,楼主。
[解决办法]
~cla_sp(){delete p;}
这句中的p不是new出来的,不能delete;
还有一句前面的人没看出来:void set_p_val(int i){*ptr->p=i;}
你的*ptr取出计算类对象,但是这个计算类对象中的p是一个指针啊,而这个参数i确实一个整型值,所以这句也是错的。*(*ptr->p) = i;这样子就行了。
最后疑问:你写这段代码的目的是什么呢?折磨你自己呢?还是折磨广大的坛友呢?实际项目中恐怕少有这些吧。多看点实际的。