1.3.1 C++经验
1.3.1 C++经验
vimer-hz
书是越读越薄的
展开
-
[linux多线程服务端编程]1.2 对象构造做到线程安全
因为构造函数期间对象还没有完成初始化,如果this指针泄露给其他对象,那其他线程可能访问这个没有初始化完成的对象,发生非预期结果。对象构造要做到线程安全,唯一的要求是再构造期间不要泄露this指针。即采用二段式构造:构造函数+initialize()转载 2023-04-15 18:46:54 · 55 阅读 · 0 评论 -
[linux多线程服务端编程]1.6 shared_ptr/weak_ptr
shared_ptr控制对象的生命期。shared_ptr是强引用,只要有一个指向x对象的shared_ptr存在,该x对象就不会析构。如果对象还活着,那么它可以提升为shared_ptr;如果对象已经死了,提升失败,返回一个空的shared_ptr。当指向对象x的最后一个shared_ptr析构或reset()时,x一定会被销毁。shared_ptr/weak_ptr的计数是原子操作,没有用锁。weak_ptr不控制对象的生命期,但它知道对象是否还活着。转载 2023-04-15 18:48:12 · 62 阅读 · 0 评论 -
[linux多线程服务端编程]1.7 系统地避免各种指针错误
用std::vector/std::string或自己编写的Buffer class来管理缓冲区,自动记住用的缓冲区的长度.注意:scoped_ptr是boost库中对这个智能指针的叫法,unique_ptr是C++11标准库中对这个智能指针的叫法。把new[]都替换为std::vector/scoped_array。用scoped_ptr,只在对象析构的时候释放一次.用scoped_ptr,对象析构的时候自动释放内存.用shared_ptr/weak_ptr.2 空悬指针/野指针。转载 2023-04-15 18:49:09 · 52 阅读 · 0 评论 -
[Effective C++]条款20:宁以pass-by-reference-to-const替换pass-by-value
条款20:宁以pass-by-reference-to-const替换pass-by-value以下考虑类对象:class Person{public: Person(); virtual ~Person(); //... private: std::string name; std::string address;}; class Student:public Person{public: Student(); ~St转载 2021-01-25 12:57:08 · 114 阅读 · 0 评论 -
[Effective C++]条款07:为多态基类声明virtual析构函数
一、从一个例子中介绍为什么要为基类使用virtual析构函数我们创建一个TimeKeeper基类和一些及其它的派生类作为不同的计时方法class TimeKeeper{public: TimeKeeper() {} ~TimeKeeper() {} //非virtual的}; //都继承与TimeKeeperclass AtomicClock :public TimeKeeper{};class WaterClock :public TimeKeeper {};cl转载 2021-01-25 11:45:47 · 170 阅读 · 0 评论 -
[Effective C++]条款09:绝不在构造和析构过程中调用virtual函数
条款09:绝不在构造和析构过程中调用virtual函数Never call virtual functions during construction of destruction.derived class中,base class的初始化先于derived class之所以不要在构造函数和析构函数起点调用virtual函数,是因为这种调用并不会带来预期的结果。举个例子,假设有这样一个class继承体系,用来模拟股市的买进、卖出的订单等。在这样的过程中,一定要经过审计,因此每当创建一个交易对转载 2021-01-25 11:04:41 · 204 阅读 · 0 评论 -
[Effective C++]条款17:以独立语句将newd对象置入智能指针
记住:以独立语句将newd对象存储于智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏。int priority();void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);//编译错误,因为shared_ptr的构造函数是个explicit构造函数,无法进行隐式转换processWidget(new Widget, priority());//编译正确,但有潜在问题。//在调用转载 2021-01-25 09:58:29 · 92 阅读 · 0 评论 -
[Googletest]模板方法设计模式在UT中的应用
http://c.biancheng.net/view/1376.html原创 2021-01-29 11:27:09 · 110 阅读 · 0 评论 -
[Googletest]GoogleTest、GoogleMock学习总结
1 源码GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework2 编译构建googletest/googletest/README.md3 googletest自带的测试代码3.1googletest/googletest/samples/CMakeLists里打开gtest_build_samples,googletest/docs/samples.md:Sample #1.原创 2021-09-22 10:15:27 · 669 阅读 · 0 评论 -
[Googletest]lcov基本使用方法
// 1 依赖apt install lcov// 2 以gtest sample10为例进行lcov测试// 编译后会出现*.gcno文件g++ –fprofile-arcs –ftest-coverage -o sample10 sample10_unittest.cpp -L xxx/gtest/lib -lgtest -lpthread// 3 运行后会出现*.gcda文件./sample10// 4 "./"要对应*.gcda文件的目录lcov -d ./ -t 'test.原创 2021-08-31 17:27:42 · 2940 阅读 · 0 评论 -
C++中的volatile
由于访问寄存器的速度要快过RAM(从RAM中读取变量的值到寄存器),以后只要变量的值没有改变,就一直从寄存器中读取变量的值,而不对RAM进行访问。在单任务的环境中,一个函数体内部,如果在两次读取变量的值之间的语句没有对变量的值进行修改,那么编译器就会设法对可执行代码进行优化。被volatile修饰的变量将一直从RAM访问其值。原创 2023-04-13 22:26:18 · 49 阅读 · 0 评论 -
C++单例模式(线程安全)
instance对象位于全局区,new的话是堆区,不用static的话是栈区。C++11,先前被称作C++0x。// 防止函数被调用。原创 2023-04-13 22:25:03 · 464 阅读 · 0 评论 -
C++ map应用之insert、遍历、erase
直接上代码,两种方式:map<string,int> m_map;m_map.insert(map<string,int>::value_type("hello",5));m_map.insert(make_pair("hello",5));也就是说,insert后面的数据是pair类型或者是value_type类型。然而对C++有了解的人都明白,其实value_type和pair<const k,v>是等价的。insert()中的参数必须是valu转载 2021-08-03 11:14:31 · 3772 阅读 · 0 评论 -
C++的回调
【1】定义回调函数的地方(上层)TestManager.cpp:ITEST.RegisterNotifyCb(std::bind(&Test));原创 2021-06-04 10:45:39 · 110 阅读 · 0 评论 -
C++调用C函数
【代码】C++调用C函数。原创 2021-05-26 20:56:11 · 66 阅读 · 0 评论 -
Fatal:can not read section ‘.dynamic‘
出现过如下编译错误问题:Fatal:can not read section '.dynamic'target C++: com.qti.chi.override_32 <= vendor/qcom/proprietary/chi-cdk/vendor/chioverride/default/chxusecaseutils.cppninja:build stopped: subc...原创 2019-12-22 16:40:01 · 188 阅读 · 0 评论