C++对象的复制——具有指针成员的类的对象的复制

简介: //smartvessel@gmail.comclass Table{Name * p;size_t sz;publish:Table(size_t s = 15){p = new Name[sz=s];}~Table(){delete[]p ;}.
复制代码
class Table{
Name * p;
size_t sz;

publish:

Table(size_t s = 15){p = new Name[sz=s];}
~Table(){delete[]p ;}

......
}

void h()
{
Table t1;
Table t2 = t1;
Table t3;
t3 = t2;
}
复制代码

在h()结束时,默认构造函数调用了2次,而析构函数被调用了3次,为何?

Table t1; 调用1次默认构造函数

Table t2 = t1;默认的对象的赋值操作,按成员赋值,其中关于指针p,仅仅是将t1.p赋值给t2.p,即t2.p = t1.p,并无内存分配。对象t1和t2的p指针均指向同一块内存。

Table t3; 调用1次默认构造函数

t3 = t2; 原t3.p指针被t2.p覆盖,此时t3.p同样指向对象t1和t2的p指针的同一块内存。注意:t3原分配给p的内存由于没有指针指向,无法利用,造成存储浪费。

h()结束,对象t1,t2,t3的析构函数调用,此时对t1,t2,t3的指针p所指的同一块存储进行了三次删除,非常危险,导致的结果是无发预料的,很可能灾难性的。

 

因此明确定义类的复制构造函数(拷贝构造函数)和赋值预算可避免这样的错误。

 

代码

 

 

详见《C++程序设计语言-特别版》page 219

 

目录
相关文章
|
6月前
|
编译器 C++
C++程序中的对象赋值和复制
C++程序中的对象赋值和复制
63 1
|
6月前
|
C++
C++程序中对象成员的引用
C++程序中对象成员的引用
47 2
|
6月前
|
存储 编译器 C++
36对象的赋值和复制
36对象的赋值和复制
32 0
|
6月前
|
C++
28对象成员的引用
28对象成员的引用
29 0
对象的相等和引用相等的区别
对象的相等和引用相等的区别
|
存储 编译器 C++
<c++> &引用概念 | 引用用法 | 引用与指针区别
<c++> &引用概念 | 引用用法 | 引用与指针区别
189 0
|
JavaScript 前端开发 Java
Java对象的引用和复制
Java对象的引用和复制
314 0
|
安全 编译器 数据安全/隐私保护
对象的动态创建和销毁以及对象的复制,赋值
🐰对象的动态创建和销毁 🐰对象的复制 🐰对象的赋值
|
设计模式
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)