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

 

目录
相关文章
|
12天前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
38 9
|
1月前
|
存储 编译器 C++
36对象的赋值和复制
36对象的赋值和复制
9 0
|
1月前
|
C++
28对象成员的引用
28对象成员的引用
9 0
从AcDbDatabase复制部分对象到新AcDbDatabase
从AcDbDatabase复制部分对象到新AcDbDatabase
|
6月前
|
Java
对象的相等和引用相等的区别
对象的相等和引用相等的区别
|
11月前
|
安全 编译器 数据安全/隐私保护
对象的动态创建和销毁以及对象的复制,赋值
🐰对象的动态创建和销毁 🐰对象的复制 🐰对象的赋值
|
JavaScript 前端开发 Java
Java对象的引用和复制
Java对象的引用和复制
282 0
|
设计模式
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
|
Java 编译器
方法引用的那些事儿
一句话介绍: > **方法引用**(**_Method Reference_**)是在 Lambda 表达式的基础上引申出来的一个功能。 先不铺展概念,从一个示例开始说起。 # 一、小示例 ```java List list = Arrays.asList(1, 2, 3); list.forEach(num -> System.out.println(num));
409 0

热门文章

最新文章