从effective C++中窥探C++11特性
这几天在看effective C++3rd,这本书算是比较经典的一本入门C++的书了。虽然年代比较久远书中讲的好多模式已经被的新特性取代了,但是从这些旧的模式中可以了解到一些C++新特性设计的初衷,也算是窥探到了C++发展的一角吧。
所以在此记录一下学习过程中那些被C++11新特性取代的旧模式吧(C++11后面的特性我还不是很了解,以后学到了再补充吧)
1、阻止编译器自动生成函数
编译器在一些情况下会为自定义类自动生成默认构造函数、拷贝构造函数和运算符,移动构造函数和运算符(C++11新特性)。但是有些自定义类不希望用户进行一些操作,就应该在设计时就考虑到这种情况。
比如:一个类Uncopyable是一个机密信息,不允许被拷贝,所以没有在类中设计拷贝控制函数。但是如果恰好写了赋值操作,则编译器会自动生成一个拷贝赋值运算符,下面代码是运行正确的,这显然与设计初衷不符。
class Uncopable;
Uncopable uncopy,user;
user=uncopy;
为了避免这种情况的发生,我们应该阻止编译器自动生成某些函数。
旧设计模式:将目标函数声明为private并且不定义
C++11新特性:将函数定义为delete,定义为delete的函数编译器不会自动为其合成相关函数并且也不允许进行相关操作。
2、阻止类被继承
派生类继承自一个带有非虚析构函数的类可能导致在销毁派生类对象时的内存泄漏,因为派生类对象销毁时可能没有销毁继承自基类的子成员。并且有一些类设计之初就不打算作为基类让其他类继承,如果这些类被继承的话会导致上述的内存泄漏。例如下列代码会导致A的对象没有被完全释放。
1 struct A{ //未考虑继承
2 A() :x(new int) { cout << "c x" << endl; }
3 ~A() { delete x;
4 cout << "d x" << endl;
5 }
6 private:
7 int* x;
8 };
9 struct B :A
10 {
11 B() :A(), y(new double) { cout << "c y" << endl; }
12 ~B() { delete y;
13 cout << "d y" << endl;
14 }
15 private:
16 double* y;
17 };
18
19
20 int main()
21 {
22 B *b = new B;
23 A *a;
24 a=b;
25 delete a; //内存泄漏
26 return 0;
27 }
输出结果:
c x
c y
d x
上述代码因为类A不含虚函数所以没有多态特性,所以删除指针a时只调用A的析构函数,销毁了A的成员x,B的成员y没有销毁导致内存泄漏。
如果即使不考虑继承但是也将析构函数设为virtual,则会增加类对象的体积并且使其具有不可移植性(会建立虚函数表,此部分看effective C++3rd 条款7)。旧的C++似乎无法阻止这种情况的发生,但是C++11弥补了这项缺陷。
C++11新特性:将类设为final,设为final的类不予许作为基类。
从effective C++中窥探C++11特性的更多相关文章
- 【Qt开发】Qt5 中对 C++11 一些新特性的封装
C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
- C++开发者都应该使用的10个C++11特性
转载自http://blog.jobbole.com/44015/ 在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开 ...
- 从Profile中窥探Unity的内存管理
刨根问底U3D---从Profile中窥探Unity的内存管理 这篇文章包含哪些内容 这篇文章从Unity的Profile组件入手,来探讨一下Unity在开发环境和正式环境中的内存使用发面的一些区别, ...
- 转载:每个C++开发者都应该使用的十个C++11特性
这篇文章讨论了一系列所有开发者都应该学习和使用的C++11特性,在新的C++标准中,语言和标准库都加入了很多新属性,这篇文章只会介绍一些皮毛,然而,我相信有一些特征用法应该会成为C++开发者的日常用法 ...
- C++开发者都应该使用的10个C++11特性 转
http://blog.jobbole.com/44015/// | 分类: C/C++, 开发 | 条评论 | 标签: C++, C语言 分享到: 本文由 伯乐在线 - 治不好你我就不是兽医 翻译自 ...
- 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)
原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-F ...
- 目前主流编译器对C++11特性的支持情况
目前主流编译器对C++11特性的支持情况 1. GCC编译器(从编译器GCC4.8.X的版本完全支持) (1)目前C++11特性,之前成为C++0X特性,从GCC4.3的后续版本中逐步对C++11进行 ...
- 开发者都应该使用的10个C++11特性
摘要: 在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备.你也许看到过许多类似介绍各种C++11特性的 ...
随机推荐
- 003-Java中的变量和数据类型
@ 目录 一.变量 1.什么变量 2.变量的三要素 3.变量的命名规范 4.变量的分类 5.变量的作用域 6.变量的注意事项 二.数据类型 1.什么是数据类型 2.数据类型有什么用 3.数据类型的分类 ...
- Java例题_48 四位数据加密
1 /*48 [程序 48 加密] 2 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的, 3 加密 规则如下: 4 每位数字都加上 5,然后用和除以 10 的余数代替该数字 ...
- 附032.Kubernetes实现蓝绿发布
蓝绿发布原理 蓝绿发布本质上是希望能优雅无误的迭代应用,以便于使应用平稳提供服务.通常是不停老版本的同时对新版本进行先发布,然后确认无误后进行流量切换,即并行部署. Kubernetes中可以通过de ...
- 第16 章 : 深入理解 etcd:基于原理解析
深入理解 etcd:基于原理解析 本文将主要分享以下三方面的内容: 第一部分,会为大家介绍 etcd 项目发展的整个历程,从诞生至今 etcd 经历的那些重要的时刻: 第二部分,会为大家介绍 etcd ...
- PaddleOCR详解
@ 目录 PaddleOCR简介 环境配置 PaddleOCR2.0的配置环境 Docker 数据集 文本检测 使用自己的数据集 文本识别 使用自己的数据集 字典 自定义字典 添加空格类别 文本角度分 ...
- Java刷题-stack
一.getMin栈 题目描述 实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 输入描述: 第一行输入一个整数N,表示对栈进行的操作总数. 下面N行每行输入一个字符串S ...
- [开源]制作docker镜像不依赖linux和Docker环境
背景 最近群友们经常反馈docker镜像制作起来有点麻烦,我开源的antdeploy工具虽然可以制作镜像但是必须有一个提前:有一台安装好docker的linux服务器.因为大家开发环境基本上都是win ...
- 一般实现分布式锁都有哪些方式?使用redis如何设计分布式锁?使用zk来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?
#(1)redis分布式锁 官方叫做RedLock算法,是redis官方支持的分布式锁算法. 这个分布式锁有3个重要的考量点,互斥(只能有一个客户端获取锁),不能死锁,容错(大部分redis节点创建了 ...
- Vue3发布半年我不学,摸鱼爽歪歪,哎~就是玩儿
是从 Vue 2 开始学基础还是直接学 Vue 3 ?尤雨溪给出的答案是:"直接学 Vue 3 就行了,基础概念是一模一样的." 以上内容源引自最新一期的<程序员>期刊 ...
- Ubuntu 快速安装Gitlab-ce
1.下载并安装gitlab,下载地址: https://packages.gitlab.com/gitlab/gitlab-ce/ sudo dpkg -i gitlab-ce_12.0.3-ce.0 ...