注册 登录
编程论坛 C++教室

关于复制控制

humy 发布于 2012-08-23 18:00, 688 次点击
程序代码:
class U_ptr
{
    friend class Hasptr;
    int*ip;
    size_t use;
   
    U_ptr(int * p):ip(p),use(1){}
    ~U_ptr(void){ delete ip;}
};
class U_ptr;

class Hasptr
{
public:
    //constructor
    Hasptr(int* p,int i):ptr(new U_ptr(p),val(0){}     //1.智能指针的计数类使用,只是在复制和赋值时起作用啊,如果不通过复制和赋值,只是通过定义时传的指针p值相同,那这个计数器没变,仍能产生悬垂指针的危险啊
   
//copy
    Hasptr(const Hasptr& p):ptr(p.ptr),val(p.val){++ptr->use;}
    //assignment operator
    Hasptr& operator=(const Hasptr&);
    //destructor  
    ~Hasptr(void)
    {
        if(--ptr->use==0)
            delete ptr;
    }
    //get element
    int* get_ptr(){  return ptr->ip;}
    int get_int(){   return val;}
    // change the appropriate data nember
    void set_ptr(int * p){ ptr->ip=p; }   //2.这里修改了ip,那use不应该改一下吗?应该和其他ip值相同的其他ptr的use保持一致吗?同时原ip的ptr的use不应该减一吗?
    void set_int(int i){val=i;}
    //return or change the value pointed to
    int get_ptr_val()const {return *ptr->ip;}
    void set_ptr_val(int i){ *ptr->ip=i;

private:
    U_ptr* ptr;
    int val;
}

3.书上说没使用计数时,析构函数用来删除指针成员,那撤销一个Hasptr时会删除其指针对象,其他由该对象复制创建的对象的指针成员将无法使用,因为  指针成员所指的对象已被撤销。
是不是这个意思:      不加析构函数时,编译器会调用一个合成析构函数,该合成的函数只会把指针所用的空间释放,而其所指对象的空间没有被释放;自己加的析构函数应为:~Hasptr(void)
    {
        
            delete ptr;
    }
而用delete时就把指针所指对象的空间也释放了?
“析构函数撤销复合类型”的复合类型是指?
4.a复制构造函数,b析构函数,c定义赋值操作符,三者只要有一个没定义,则如由对象Hasptr  A复制赋值而来的对像B,会在A被删除后,其基础的int对象无法访问,且没被撤销
按照2.的说法我能理解没有b会这样,可没a,b怎么也这样?
程序代码:
class TreeNode{
public:
   TreeNode():count(0){}
   TreeNode(const TreeNode&);
   ~TreeNode();
private:
   string value;
    int count;
    TreeNode l;
   TreeNode r;
}
   

5.上面是书上的一个例子,为什么operator=的定义?
谢谢
10 回复
#2
humy2012-08-23 18:06
此外,生成时出现如图error不知怎么回事?
只有本站会员才能查看附件,请 登录
#3
humy2012-08-23 19:46
只有本站会员才能查看附件,请 登录
哎。。什么啊,今天说std出问题的次数好多啊?为什么
#4
lonmaor2012-08-23 20:15
回复 3楼 humy
我没用过std::set容器,不过看的两个:号都分开了,原本还以为是全角字符。
#5
lz10919149992012-08-23 20:31
LZ看的是什么书,你的理解偏差还挺大的,如果你有C的基础的话,不如看看C++ Primer或Thinking in C++试试?
#6
pangding2012-08-24 02:58
楼主真是问题妹妹呀。问题问得都还挺难答。
#7
humy2012-08-25 17:12
回复 5楼 lz1091914999
有c 语言基础,真是在看C++ Primer。。。。我问的问题都是看书时想的。。现在到了后几章,觉的真的深奥了许多。。。有偏差的话,应该是我的问题。。不是书,
#8
humy2012-08-25 17:15
回复 6楼 pangding
呵呵呵,没办法。。。随便看看,脑子里就有疑问。。。还要多些大家帮忙了。。。
#9
BianChengNan2012-08-27 16:40
以下是引用humy在2012-8-23 18:00:04的发言:

class U_ptr
{
    friend class Hasptr;
    int*ip;
    size_t use;
     
    U_ptr(int * p):ip(p),use(1){}
    ~U_ptr(void){ delete ip;}
};
class U_ptr;
 
class Hasptr
{
public:
    //constructor
    Hasptr(int* p,int i):ptr(new U_ptr(p),val(0){}     //1.智能指针的计数类使用,只是在复制和赋值时起作用啊,如果不通过复制和赋值,只是通过定义时传的指针p值相同,那这个计数器没变,仍能产生悬垂指针的危险啊
    //copy
    Hasptr(const Hasptr& p):ptr(p.ptr),val(p.val){++ptr->use;}
    //assignment operator
    Hasptr& operator=(const Hasptr&);
    //destructor   
    ~Hasptr(void)
    {
        if(--ptr->use==0)
            delete ptr;
    }
    //get element
    int* get_ptr(){  return ptr->ip;}
    int get_int(){   return val;}
    // change the appropriate data nember
    void set_ptr(int * p){ ptr->ip=p; }   //2.这里修改了ip,那use不应该改一下吗?应该和其他ip值相同的其他ptr的use保持一致吗?同时原ip的ptr的use不应该减一吗?
    void set_int(int i){val=i;}
    //return or change the value pointed to  
    int get_ptr_val()const {return *ptr->ip;}
    void set_ptr_val(int i){ *ptr->ip=i;
 
private:
    U_ptr* ptr;
    int val;
}
 
3.书上说没使用计数时,析构函数用来删除指针成员,那撤销一个Hasptr时会删除其指针对象,其他由该对象复制创建的对象的指针成员将无法使用,因为  指针成员所指的对象已被撤销。
是不是这个意思:      不加析构函数时,编译器会调用一个合成析构函数,该合成的函数只会把指针所用的空间释放,而其所指对象的空间没有被释放;自己加的析构函数应为:~Hasptr(void)
    {
         
            delete ptr;
    }
而用delete时就把指针所指对象的空间也释放了?
“析构函数撤销复合类型”的复合类型是指?
4.a复制构造函数,b析构函数,c定义赋值操作符,三者只要有一个没定义,则如由对象Hasptr  A复制赋值而来的对像B,会在A被删除后,其基础的int对象无法访问,且没被撤销
按照2.的说法我能理解没有b会这样,可没a,b怎么也这样?
class TreeNode{
public:
   TreeNode():count(0){}
   TreeNode(const TreeNode&);
   ~TreeNode();
private:
   string value;
    int count;
    TreeNode l;
   TreeNode r;
}
   
5.上面是书上的一个例子,为什么operator=的定义?
谢谢
我就特想知道楼主这例子哪来的?C++ Primer上的?我看着像,但是貌似和源码不一样。还请指教
#10
humy2012-08-27 22:45
回复 9楼 BianChengNan
真的是书上的。。。。
#11
BianChengNan2012-08-28 10:00
回复 10楼 humy
请问是哪本书?我没怀疑不是书上的,我看着像是primer上的
1