隐含的资源泄露 原文章是《Effective C++》条款17 以独立语句将newed对象嵌入智能指针 考虑这样一个情况 void processWidget(shared_ptr<Widget>, int); int priority(); processWidget需要一个智能指针和一个代表优先级的int,其中优先级可以通过priority获得 那么可能的一种写法就是 processWidget(shared_ptr<Widget>(new Widget), priority()); 那…
隐含的资源泄露 原文章是《Effective C++》条款17 以独立语句将newed对象嵌入智能指针 考虑这样一个情况 void processWidget(shared_ptr<Widget>, int); int priority(); processWidget需要一个智能指针和一个代表优先级的int,其中优先级可以通过priority获得 那么可能的一种写法就是 processWidget(shared_ptr<Widget>(new Widget), priority()); 那…
RAII 拓展 今天的内容主要取自《Effective C++》 之前有一节我有讲到有关RAII的用法 今天重新回去读了一下effective c++才发现之前自己有一部分理解是错的 这里进行一个纠正,并进行一点对RAII的补充 以对象管理资源的观念被称为RAII,因为我们总是在获得一笔资源后于同一个语句内以他初始化某个资源管理对象 所以对RAII的理解指的是资源管理对象的初始化是在资源获取的同时进行的 所以也可以叫这种资源管理对象RAII对象 智能指针就是一种RAII对象,C++中没有为动态分配数组设计的类似智能…
异常安全性 老样子,先放出第一手信息源 CSDN wiki 今天我们只讨论简单的异常安全 简单点说,异常安全就是保证在执行我们的函数的时候,不会出现资源的破坏,或者泄露的情况 之前讲到的RAII其实就是一种处理情况,即利用了自动析构的特性帮助我们管理资源 这里再来讲一种情况 class A { A &operator= (const A &others) { if (this != &others) { delete ptr; ptr = new T(*others.ptr); } retu…
operator->() 说实话这一个小玩意单独拿出来做一章有点小题大做,所以这篇文章相对会比较短 还是,希望给大家第一手的信息,而不是我嚼过的 stackoverflow tutorialspoint cppreference 在搜集资料的过程中,我还发现了->* 和 .* 这样的运算符,他们主要就是指向类成员的指针,无论是成员函数还是成员变量 可以简单的理解为,从右向左看,先解引用,然后在访问成员 具体可以看这里 stackoverflow 现在回到->这里,重载的operator->()必须是非静…
RAII 先把原文章贴在前面,可以先看原文章有了自己的理解,再来看我说的补充 原文章 RAII(Resource Acquisition Is Initialization) 一些背景的介绍就不多说了,网上讲这个的貌似也不少,这里就说一说自己的理解吧 资源的获取即初始化,其实直观的来说,就是new的组合 记得之前我有一篇文章讲new,当我们在c++中new一个对象的时候,他会首先用operator new来进行空间的分配,然后再执行对象的构建,当分配不成功的时候,对象也不会被成功的构造,这就是RAII直接的意思 我…
stl小应用 前几天有看到一些stl函数,恰好今天的leetcode的每日一题可以让我们把这些函数运用上来 要用到的函数主要有 sort() transform() nth_element() accumulate() 先看题 题意很简单,就是叫我们统计出词频前K大的单词 这里先说我解决这道题的思路,复杂度应该是O(n + klogk)的,理论上是比官方的O(nlogk)要更好一些的 但是应该是我常数写的比较大导致最后结果比较慢 思路就是首先用哈希表统计出每个单词的词频,然后用nth_element来找出前k个,最…
std::accumulate 对于函数式编程的定义较为广泛,大家可以去网上搜一搜 然后在开始之前,我们明确一个概念 能够接收函数作为参数或返回函数作为结果的函数成为高阶函数 C++中的仿函数,lambda表达式让C++函数式编程成为可能 对于我们今天的主角,std::accumulate,他是STL提供的一个高阶函数,可以用来计算集合中所有条目的累加和 使用方法如下 std::accumulate(array.begin(), array.end(), 0) // 前两个参数是容器的迭代器,用于表示开头和结尾 /…
虚函数的继承 今天的文章相对简单 考虑下面这个程序 class A { public: virtual void test() { cout << "A"; } }; class B: public A { public: void test() { cout << "B"; } }; class C: public B { public: void test() { cout << "C"; } }; int main() { C c; B *ptr = &c; ptr…
Daily C/C++ new表达式 今天重新打开了STL源码剖析这本书,想着从头开始看一遍 没想到刚开始的allocator的部分的代码就给我卡住了,最后还是上了cppreference,才找到了比较全的资料,这里就简单说一下c++中的new表达式 首先,new表达式不仅仅是我们平时用来在堆上分配内存用的东西,他还有很多延伸出来的部分 我们来看cppreference的定义 new 表达式尝试申请存储空间,并在已申请的存储空间上,尝试构造并初始化一个无名的对象或对象数组。new 表达式返回一个指向其所构造的对象或…
linux/list.h 简单解析 linux/list.h是linux内核中实现的链表部分 由于最近在看操作系统概念,第二章的编程练习是叫我们去写一个很简单的内核模块,其中涉及到了list.h的内容,书中也有推荐大家去看一看再完成项目 内核中的代码,至少list.h这里的代码写的还是十分易懂的,而且由于篇幅原因,这里只会介绍项目中会用到的简单的几个函数和宏 阅读本篇文章最好是自己也打开这个文件,跟着一起看效果才好 首先看链表结构的定义 struct list_head { struct list_head *ne…