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

简介:
复制代码
复制代码
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

目录
相关文章
存储 编译器 Linux
13 0
|
1天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”
|
1天前
|
编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
|
1天前
|
存储 编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
|
1月前
|
存储 C语言
C语言:使用指针遍历数组
C语言:使用指针遍历数组
|
8天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
15 0
|
8天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
6 0
|
23天前
|
存储 人工智能 编译器
C语言指针详解
指针运算,指针和数组,二级指针
C语言指针详解
|
23天前
|
存储 C语言
C语言第二十四弹---指针(八)
C语言第二十四弹---指针(八)
|
23天前
|
编译器 C语言
C语言第十九弹---指针(三)
C语言第十九弹---指针(三)

热门文章

最新文章