C++
控卫1号
这个作者很懒,什么都没留下…
展开
-
Const成员函数的异常安全性
如果我们在数学领域里工作,我们可能会发现用一个类来表示多项式会很方便。在这个类中,如果有一个函数能计算多选式的根(也就是,多项式等于0时,各个未知量的值)将变得很方便。这个函数不会改变多项式,所以很自然就想到把它声明为const:class Polynomial{public: using RootsType = //一个存放多项式的根的数据结构 ...转载 2019-12-03 16:59:51 · 254 阅读 · 0 评论 -
多线程读操作的异常安全性
最近在写一个项目,程序偶现一个“double free” 问题,经过排查发现在实际运行情况中会有多个线程调用一个loadString操作,而原本loadString只是一个读操作,而多线程共同读同一个资源信息按理说应该是不会有同步问题出现的,但是通过GDB调试发现程序的崩溃处在switchLanguage的一个赋值操作。然后我走进switchLanguage中发现那个崩溃的赋值...原创 2019-12-03 16:46:49 · 314 阅读 · 0 评论 -
C++ const成员函数中成员的隐含类型
最近在写项目遇到一个之前忽略的有关const 成员函数的特性:class sample{public: sample(int* p) : _p (p) {}private: int* _p;};class Test {public: void getA() const { sample s(&a); }private: int a; int b;...原创 2019-12-03 11:03:32 · 288 阅读 · 0 评论 -
Effective C++ 条款14:在资源管理类中小心copying行为
首先来看一个例子: 1 #include iostream> 2 using namespace std; 3 4 class Lock 5 { 6 public: 7 explicit Lock(int* pm): m_p(pm) 8 { 9 lock(m_p);10 }11 12 ~Lock()13转载 2018-01-20 15:50:01 · 254 阅读 · 0 评论 -
C++类中对同类对象private成员的访问
转:http://www.cnblogs.com/yanqi0124/p/3828507.html私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有成员变量,因而,产生了困惑.下面以具体实例进行说明: 疑惑:为什么第2转载 2018-01-20 16:33:12 · 733 阅读 · 0 评论 -
Effective C++ 条款15:在资源管理类中提供对原始资源的访问
转:http://blog.csdn.net/zs634134578/article/details/18896883问题聚焦: 资源管理类是为了对抗资源泄露。 如果一些函数需要访问原始资源,资源管理类应该怎么做呢? 关于资源管理的概念总是显得那么的高大上,其实只是抽象一点。下面用一个例子还说明本节的主题:转载 2018-01-20 16:43:47 · 150 阅读 · 0 评论 -
关于C++ 的operator new、 operator new[]、operator delete、operator delete[]、placement new、placement delete
1.operator new 与 new operator的区别答:我们经常会使用new来动态分配一个对象,而使用的new就是new运算符。那么new一个对象后面会发生什么事呢? ① 调用operator new函数申请一段内存(大小刚好就是你要new的那个对象的大小,那个大小会作为参数传给函数,如果是operator new[]则是所有对象总共的大小) ② 然后编译器...原创 2019-01-03 19:46:37 · 714 阅读 · 0 评论 -
为什么new一个数组一定要搭配delete []?
今天在学习了侯捷老师的《C++面向对象高级编程》的课程,对于一个之前感兴趣的点有了新的认识,下面来进行总结一下: 我们知道当我们申请一个数组时我们会采用 new classname[3]这种形式,在很多编程技巧书上会强调当你使用new []就应该搭配delete[]使用,如果你对一个指向数组的指针进行delete的话,行为未定义。那么究竟是为什么呢?很简单可以想到的是当我们...原创 2019-01-05 17:10:15 · 1935 阅读 · 0 评论 -
《深入探索C++对象模型》读后笔记
今天阅读完了《深入探索C++对象模型》对许多问题有了更深的理解,下面进行总结一下: 1.关于C++的对象布局 答:① 当没有继承情况出现时,类的大小以及排列可以理解为按顺序排列,对象与对象之间存在着alignment,也就是字节填充可以使得对象大小为数据类型的整数倍(关于结构体大小的研究可以参考https://blog.csdn.net/jueduiwudi6/article/det...原创 2019-01-04 15:04:20 · 278 阅读 · 0 评论 -
只能在堆上或只能在栈上创建的类
本文上半段借鉴了http://www.cnblogs.com/sopc-mc/archive/2011/11/03/2235124.html1. 只能在堆(heap)上创建对象/禁止产生栈(stack)对象 创建栈对象时会移动栈顶指针以“挪出”适当大小的空间, 再在这个空间上直接调用对应的构造函数以形成一个栈对象, 而当函数返回时会调用其析构函数释放这个对象, 再调整栈顶指针...原创 2019-01-02 20:27:31 · 460 阅读 · 0 评论 -
头文件中定义函数引发的multiple definition
http://jiadebin.github.io/2017/04/03/%E5%A4%B4%E6%96%87%E4%BB%B6%E4%B8%AD%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0%E5%BC%95%E5%8F%91%E7%9A%84multiple-definition/转载 2019-04-25 13:20:31 · 644 阅读 · 0 评论 -
Effective C++ 条款13:以对象管理资源
1. 在使用堆内存时,需要手动delete指针以防内存泄露,但是有些例外情况(例如发生异常)会使得内存资源无法释放,此外,使用者也极有可能忘记释放堆内存,因此需要" 以对象管理资源",也就是把资源放进对象内,用析构函数来确保资源被释放,这种思想被称为"资源取得时机就是初始化时机"(Resource Acquisition is Initialization; RAII,名字并没有体现这种思想)转载 2018-01-20 15:14:44 · 161 阅读 · 0 评论 -
Effective C++ 条款12:复制对象时勿忘其每一个成分
原创 2018-01-20 14:45:50 · 167 阅读 · 0 评论 -
More effective C++ 条款25 将构造函数和非成员函数虚拟化
7.1 Item M25:将构造函数和非成员函数虚拟化从字面来看,谈论“虚拟构造函数”没有意义。当你有一个指针或引用,但是不知道其指向对象的真实类型是什么时,你可以调用虚拟函数来完成特定类型(type-specific)对象的行为。仅当你还没拥有一个对象但是你又确切地知道想要的对象的类型时,你才会调用构造函数。那么虚拟构造函数又从何谈起呢?很简单。尽管虚拟构造函数看起来好像没有意义,其实它转载 2018-01-30 21:18:03 · 244 阅读 · 2 评论 -
Effective C++ 条款02 尽量以const,enum,inline替换#define
① 当需要一个常量时尽量用const而不是宏,因为比如#define ASPECT_RATIO 1.653 记号从未被编译器看见,它是在预处理器处理源码的时候就被移走了。于是记号名称有可能没进入记号表(连接的时候所有的变量、函数都会作为一个记号放在一个表里),当发生编译错误时错误信息可能只提到1.653而不是这个记号,如果你把这个宏定义在其他头文件时,编译时你可能会由于忽视了这个宏定义而对编译器原创 2018-01-18 14:13:08 · 139 阅读 · 0 评论 -
Effective C++ 条款05 什么时候不应该使用编译器默认提供的函数
templateclass NameObject {public: NameObject(string& name, const T& value);private: string& nameValue; const T objectValue;};string newDog("Persephone");string oldDog("satch");NameObject p(原创 2018-01-18 17:09:16 · 120 阅读 · 0 评论 -
Effective C++ 条款06 若不想使用编译器自动生成的函数,就该明确拒绝
在设计并不是很复杂的类中使用编译器提供的那些函数也能很好地完成工作,但是对于一些复杂的类中使用这类函数会导致很多问题(资源泄露,浅拷贝等等都会导致许多你并不希望的问题出现),所以一般来说若是我们不需要编译器提供的这些函数就该明确告诉它,可能下意识你会说既然不需要干脆就不要声明这些函数,但是编译器会在你未声明的前提下默认替你产出一份。而如果你自己声明则又违背了自己一开始对类不允许拷贝的设计初衷。所以原创 2018-01-19 14:35:25 · 328 阅读 · 0 评论 -
Effective C++ 条款07 为多态基类声明virtual 析构函数
class Timekeeper{public: Timekeeper(); ~Timekeeper();};class AtomicClock :public Timekeeper {};class WaterClock :public Timekeeper {};class WristClock :public Timekeeper {};设计一个factory函数:Timerkeeper*原创 2018-01-19 15:09:49 · 163 阅读 · 0 评论 -
Effective C++ 条款08 别让异常逃离析构函数
这章非常容易理解:因为C++并不禁止析构函数吐出异常,只是不鼓励这样做而已。一、原因假设我们有10个装着鸡蛋的容器,而且现在我们还想着把它在析构函数打烂。class Egg {public : ... ~Egg() { // 这里可能出错,导致蛋打不烂 }};void foo() { vector v // 假设v中间有10转载 2018-01-19 15:26:22 · 128 阅读 · 0 评论 -
Effective C++ 条款09 绝不在构造和析构过程中调用virtual函数
本条款的内容主要讲述了在子类和父类之间的构造和析构阶段不要去调用virtual函数,因为那可能会和你预想的结果有出入。class Transportion{ Transportion(); virtual void logTransction()const = 0;//纯虚函数};Transportion::Transportion(){ //........ logTransction();原创 2018-01-19 15:51:19 · 162 阅读 · 0 评论 -
Effective C++ 条款10 令operator=返回一个 reference to *this
这章内容十分简单,主要关于赋值操作时如果你将返回类型声明为引用类型则可以实现连锁形式就像内置类型一样:int A,B,C;A=B=C=5;当你需要为你的类也提供这样的连续赋值的操作时则赋值操作符的返回值应该返回引用类型这个规则不仅适合标准赋值,也适合所有赋值相关运算,例如class Widget{public: Widget& operator=(const Widget&) { //...原创 2018-01-19 15:59:02 · 143 阅读 · 0 评论 -
Effective C++ 条款11:在operator中处理自我赋值
通常我们在设计一个类并为它声明了赋值操作符时有一种状况总是需要处理——自赋值,如果用户在代码中注意避免自赋值当然可以但是那是很理想的状况,在一些复杂的情况下用户自己可能都不会意识到做了“自赋值”这个操作。例如: *px=*py;//潜在的自我赋值 如果px和py恰巧指向同一个东西,这也是自我赋值。这些并不明显的自我赋值,是“别名”带来的结果。我们来看一段代码:cl原创 2018-01-20 14:24:56 · 327 阅读 · 0 评论 -
Effective C++ 条款17:以独立语句将newd的对象放进智能指针
以独立语句将new出来的对象存储于智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露 processWidget(shared_ptr (new Widget),priority()); 执行分两部分: 1.new Widget; 2.调用shared_ptr的构造函数 3.调用priority() 但是由于C++语言的取参数的次序弹性大原创 2018-01-21 13:49:13 · 200 阅读 · 0 评论