随笔分类 -  C/C++学习笔记

学习C/C++时的一些想法
摘要:段错误定位 原因是昨天遇到一个BUG,复现概率很小,一直复现了一下午,后来google发现可以用execinfo.h里的backtrace函数及信号处理机制, 来让程序在发生段错误时自动打印调用堆栈。最后终于复现出来了两次,用这个函数也定位到了出错位置,是多线程下的一个同步问题。 之前遇到的BUG基 阅读全文
posted @ 2024-07-09 09:32 hellozhangjz 阅读(45) 评论(0) 推荐(0) 编辑
摘要:先打印出某个地址,然后阻塞(getchar())进程,查一下进程的 id,然后执行Linux 命令pmap {pid} 查看进程的空间布局(MAC 使用vmmap {pid}),将之前打印的地址对应到某一段。 using namespace std; #define FUCK(x) cout << 阅读全文
posted @ 2024-04-15 14:20 hellozhangjz 阅读(28) 评论(0) 推荐(0) 编辑
摘要:1、互斥量 可以确保同一时间只有一个线程访问临界区,防止出现竞态条件。 2、原子操作 std::atomic<int> mutex(1); 对原子变量的操作是线程安全的。 3、读写锁 std::shared_mutex mutex; // 读者:共享锁定 mutex.lock_shared(); m 阅读全文
posted @ 2024-03-07 19:55 hellozhangjz 阅读(157) 评论(0) 推荐(0) 编辑
摘要:Iterator Traits 萃取出 Iterator 的性质:迭代器种类、迭代器所指数据类型、迭代器距离类型、迭代器所指数据引用、迭代器所指数据指针。根据不同的迭代器种类可以采取不同的算法策略。但是用iter::interator_categotry、iter::value_type、iter: 阅读全文
posted @ 2024-03-07 13:28 hellozhangjz 阅读(25) 评论(0) 推荐(0) 编辑
摘要:static_cast<type_id>(expr) 用于基本类型的转换,也可以将继承关系的对象指针或引用之间进行上下转型,但是在没有运行时类型检查的情况下,不保证类型安全。 static_cast<type_id>(expr) 动态转换用于在继承体系中进行安全的上下转型。它允许在运行时判断指针或引 阅读全文
posted @ 2024-02-28 10:01 hellozhangjz 阅读(6) 评论(0) 推荐(0) 编辑
摘要:更安全的展开宏定义 #define DOSOMETHING foo1(); foo2(); if(condition) DOSOMETHING /* if(condition) foo1(); foo2; */ 以上代码会导致foo2();始终运行。改为do{}while(0)就可以。do{}whi 阅读全文
posted @ 2024-02-27 16:32 hellozhangjz 阅读(12) 评论(0) 推荐(0) 编辑
摘要:https://www.cnblogs.com/qg-whz/p/5140930.html 1、申请内存位置 new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存 阅读全文
posted @ 2024-02-27 14:27 hellozhangjz 阅读(6) 评论(0) 推荐(0) 编辑
摘要:原地址:https://www.cnblogs.com/longcnblogs/p/7642951.html 一、C++中的对象模型 1、 概念 语言中直接支持面向对象程序设计的部分; 对于各种支持的底层实现机制。(没看懂……) 2、 类中的成员分类 a) 成员函数 i. static functi 阅读全文
posted @ 2024-01-04 21:03 hellozhangjz 阅读(7) 评论(0) 推荐(0) 编辑
摘要:虚函数表 C++ 对象模型 在有虚函数的情况下,C++对象的模型可以概括为:虚函数表指针+数据struct。在对象所在的内存里:前8个字节(64位系统)是虚函数表所在地址,后边是对象中的member data。在多态的实现里,父指针就是根据所指向内存里的第一个地址来找到对应的虚函数表从而实现多态。 阅读全文
posted @ 2024-01-04 19:20 hellozhangjz 阅读(19) 评论(0) 推荐(0) 编辑
摘要:线程之间共享代码、资源、进程(内存)空间、打开文件等。 线程同步机制 互斥锁 互斥锁本质是一个全局变量,其值为0时表示没锁,可以对其进行上锁(+1),而且上锁的操作由硬件和操作系统保证是原子操作,所以不存在两个线程同时上一把锁。其值为1时表示上锁,线程再进行lock操作会阻塞自己,并在互斥锁队列里等 阅读全文
posted @ 2023-11-23 10:40 hellozhangjz 阅读(20) 评论(0) 推荐(0) 编辑
摘要:auto cmp = [] (int x, int y) {return true;}; priority_queue<int, vector<int> , cmp> q; 报错第三个参数失配,需要一个类型,而不是对象。平时用sort直接传cmp习惯了,才发现这类模板尖括号内要传类型,包括set和m 阅读全文
posted @ 2023-03-08 14:23 hellozhangjz 阅读(29) 评论(0) 推荐(0) 编辑
摘要:C++面向对象 封装:实现与接口分离 继承:定义相似的类型,并对这种相似关系建模。 多态(动态绑定):一定程度上忽略相似类型的差别,用一种统一的方式使用这些对象,用虚函数实现。 动态绑定什么时候发生:用父类的指针或者引用调用虚函数时,根据其绑定的对象类型决定运行时的函数版本(虚函数)。注意,虚函数必 阅读全文
posted @ 2022-07-02 10:16 hellozhangjz 编辑
摘要:所有讨论都是底层const指针或引用,顶层const不会传递进模板。 模板中有const,不管传进来是否是const,T都是非const类型。 template<typename T> void f(const T& a) { } int a; const int b = 10; f(a); //T 阅读全文
posted @ 2022-06-10 10:04 hellozhangjz 阅读(221) 评论(0) 推荐(0) 编辑
摘要:struct Test { Test(){cout << "默认\n";} Test(Test &&) {cout << "移动\n"; }; Test & operator=(Test &&) {cout << "赋值\n"; return *this;} }; Test func() { ret 阅读全文
posted @ 2022-06-08 16:40 hellozhangjz 阅读(26) 评论(0) 推荐(0) 编辑
摘要:decltype会识别const和引用 decltype一个表达式的时候会判断该表达式是左值还是右值,如果是左值就返回引用,否则就返回非引用。 int &a = xx; const decltype(a) b = xxx; typedef int* pp; const pp x; 这里的b是int& 阅读全文
posted @ 2022-06-07 09:52 hellozhangjz 阅读(33) 评论(0) 推荐(0) 编辑
摘要:首先明确一个类的用户有三种: 一类用户:类的成员和友元 二类用户:子类的成员及子类的友元 三类用户:外部的用户代码(通过类的对象或指针) 一个类有三种成员 private:只有一类用户可以访问private成员。 protected:只有一、二类用户可以访问protected成员。 public:所 阅读全文
posted @ 2022-05-24 11:40 hellozhangjz 阅读(514) 评论(0) 推荐(0) 编辑
摘要:类型转换函数负责将一个类类型转换成其他类型。典型的一个例子是将cin >> x作为循环的条件,就是将一个istream对象转换成了bool类型。基本形式如下 operator type() const; 类型转换运算符通常是隐式执行,容易引发错误,最好将其定义成显式的。 class A{ publi 阅读全文
posted @ 2022-05-21 18:18 hellozhangjz 阅读(27) 评论(0) 推荐(0) 编辑
摘要:一个对象是左值还是右值会影响其成员函数的调用,在参数后边放置一个引用限定符来修饰:&表示该对象是左值,&&表示该对象是右值。 class Foo{ public: Foo sorted() &&; //右值对象可以调用 Foo sroted() const &; //任何对象都可以 private: 阅读全文
posted @ 2022-05-18 20:14 hellozhangjz 阅读(108) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示