c++
吕白_
希望自己技术越来越强
展开
-
C/C++ 栈帧笔记
原创链接非原创, 有删改,仅做个人笔记1.我们在调用它的时候系统做了什么?2.main函数中如果还有另一个函数,在跳转后运行完这个函数时,编译器怎么知道下一行执行哪个语句呢?会不会又从头执行了?3.函数在结束之后(运行到反花括号“}”处),系统又是怎么处理的?4.不同的语言对函数形参内存的处理都是一样的吗?5.函数的返回值有哪些类型?都是怎么从函数中返回回来的呢?示例代码:#...原创 2020-04-21 21:06:13 · 1249 阅读 · 0 评论 -
智能指针shared_ptr与unique_ptr详解
为什么使用动态内存程序不知道自己需要多少对象; 程序不知道对象的准确类型; 程序需要在多个对象之间共享数据;动态内存在哪里程序有静态内存、栈内存。静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数内的非static对象。分配在静态或栈内存中的对象由编译器自动创建或销毁。对于栈对象,仅在其定义的程序块运行时才存在;s...原创 2018-05-07 21:08:07 · 33430 阅读 · 4 评论 -
std::move何时发生真正的移动
c++11增加了一个新的类型--右值引用,而移动语义是通过右值引用来匹配临时值的. 尽管不能将一个右值引用直接绑定到一个左值上,但可以通过move将一个左值显示的转换为对应的右值引用类型 move,这是一个具有迷惑性的名字,实际上,move函数并没有真正的移动对象,他只是将该对象从一个左值转换为一个右值 #include <iostream>#include &...原创 2018-06-23 22:42:42 · 525 阅读 · 0 评论 -
c++11 : 以类内成员函数初始化线程
今天敲了这样一段代码class t {public: vector<shared_ptr<thread> > t1;public: t() { for (int i = 0; i < 3; i++) { t1.push_back(make_shared&原创 2018-07-25 09:40:43 · 3044 阅读 · 0 评论 -
Linux下获取时间函数gettimeofday()
选择gettimeofday()函数的原因:精度比timer()函数高很多,time函数只精确到秒,而gettimeofday精确到微妙,足以满足各种所需,虽然有精度比它更高的,但是它的系统调用开销相对更小函数原型#include<sys/time.h>int gettimeofday(struct timeval* tv, struct timezone* tz...原创 2018-08-03 17:16:10 · 8242 阅读 · 0 评论 -
使用C++11进行多线程开发 (std::thread)
下一次, 我一定, 好好手动保存博客文章目录创建线程std::thread 类使用join()使用 detach()警惕作用域线程不能复制给线程传参传递指针传递引用以类成员函数为线程函数创建线程C++11 增加了线程以及线程相关的类, 而之前并没有对并发编程提供语言级别的支持std::thread 类使用 std::thread 类来创建线程, 我们需要提供的只是线程函数, 或者线...原创 2018-09-30 16:27:30 · 2871 阅读 · 0 评论 -
记一次BUG: set / map 添加元素失败??? /* (strict weak ordering) */
文章目录BUG 描述set / map 的 insert / emplace 的返回值set / map 的去重于是 BUG 就诞生了 :!!!BUG 描述记录一个纠结了一天的 BUG:向 set 容器中添加自定义类, 然后发现并没有添加进去, 真的是头大, 排查发现告诉我已经有相同 key 值元素存在了, 可我明明两个值不同set / map 的 insert / emplace 的返...原创 2019-01-20 00:36:29 · 890 阅读 · 2 评论 -
C++类成员函数可以访问同类不同对象的私有成员
example如下例:class Test{public: Test(int v) : val(v) {} Test(const Test&amp; t) { val = 100; cout &lt;&lt; t.val &lt;&lt; endl; } void show(Test a) { cout &lt;&lt; a.val &lt;&原创 2019-01-29 20:38:25 · 6366 阅读 · 4 评论 -
小心使用指针当做 unordered_set / unordered_map 的键
当我们试图使用指针作为哈希的键时, 要小心下面的情况:#include <set>#include <map>#include <vector>#include <memory>#include <utility>#include <iostream>#include <unordered_set>...原创 2019-04-04 20:46:34 · 2578 阅读 · 0 评论 -
[STL 学习]: STL的空间配置器
本篇博客大部分内容来自于于侯捷老师的STL源码剖析和一些博客, 仅用作个人的学习记录和日后复习, 如果有博主觉得侵权, 可以联系我删除文章目录new / delete 和 ::operator new / ::operator deletestd::allocconstruct 和 destroy空间的配置与释放第一级配置器:二级配置器:空间配置函数 allocate()空间释放函数 deal...原创 2019-03-27 16:11:42 · 343 阅读 · 0 评论 -
Linux下安装protobuf以及在C++中使用
文章目录前言安装并配置环境变量简单使用前言本文只介绍如何安装protobuf, 如何编译使用了protobuf的 C++ 代码至于详细的protobuf对应产生的 C++ 的 API, 下一篇博客再讨论安装并配置环境变量安装辅助工具sudo apt-get install autoconf automake libtool curl make g++ unzip获取源代码,...原创 2019-05-02 23:55:47 · 6013 阅读 · 3 评论 -
使用cmake编译,组织C++项目
文章目录前言例一例二例三前言这篇博客是我对cmake用法的一些经验总结, 还很浅显, 如果有错误或者更好的方案, 欢迎指正~使用方法统一为在build目录中执行:$: cmake ..$: make我觉得养成外部编译是一个好习惯例一目录结构为:lzj@lzj:~/C-Plus-Plus/makefile_cmake/cmake_1$ tree.├── build├...原创 2019-05-08 19:51:23 · 1945 阅读 · 1 评论 -
c++优先队列(priority_queue)用法详解
既然是队列那么先要包含头文件#include <queue>优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的 定义:priority_queue<Type, Container, Functional> Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用原创 2018-04-14 10:58:07 · 498028 阅读 · 98 评论 -
C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解
代码编译运行环境:VS2012+Debug+Win32模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程。对于函数模板而言,模板实例化之后,会生成一个真正的函数。而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始化。模板的实例化分为隐式实例化和显示实例化。对函数模板的使...转载 2018-04-17 21:09:39 · 680 阅读 · 0 评论 -
cin没有反应?cin、cin.clear()、cin.ignore()与输入缓冲区
C++将输入看作是流入程序的字符流,iostream文件定义cin为表示这种流的对象对应的输入数据都会先存入输入缓冲区,cin从输入缓冲区中读入数据,所以当缓冲区中有残留数据时,cin直接取得残留数据而不会请求键盘输入 cin是以空格为分隔的,而读到回车后,结束输入,丢掉换行,即回车在正常情况下不进入缓冲区 那么,在非法输入后,我们会面对什么呢?#include<iostre...原创 2017-10-17 23:10:31 · 3026 阅读 · 1 评论 -
return *this和return this
看到书中的return *this比较疑惑,查询过后总结如下。class temp{ ...;}假如定义temp *get(){return this;},那么返回的this就是地址,即返回一个指向对象的指针 假如定义temp get(){return *this;} 那么返回的就是对象的克隆,是一个临时变量 假如定义temp &get(){return *this;} 那么返回的就原创 2017-11-07 20:28:31 · 3229 阅读 · 0 评论 -
显示具体化、显示实例化、隐式实例化
讨论这三者的区别我们要先认识函数模板,函数模板是C++新增的功能,他会创建一个通用的函数以支持多种不同类型的形参,避免函数体的重复设计,在我们需要重复用到某一段代码但是需要处理不同类型的参数时,使用函数模板是很方便的一个手段他最大的特点是把数据类型也作为了参数每一个函数用一个函数模板,想让几个函数使用共同的模板参数,应当使用模板类显示实例化:template void Swap<int> (in原创 2017-10-23 22:36:49 · 2403 阅读 · 2 评论 -
三种继承、多态-虚函数
总结一下最近学到的类继承的知识,包括三种继承方式、多态的实现、动态联编和静态联编。 欢迎各位指正其中的错误。 以后的理解更加深刻了回来更新和修改。三种继承从一个类,派生出另一个类时,原始类称为基类(父类),继承类称为派生类(子类)派生类对象存储了基类的数据成员,且可以使用基类的方法,但不能直接访问基类的私有成员,必须使用基类的公有方法进行访问。可以根据需要添加额外的成员因为构造函数不能继承,原创 2017-11-19 20:59:52 · 747 阅读 · 0 评论 -
解决munmap_chunk(): invalid pointer
今天在敲一段代码时编译正确,运行时却出现bug 先是显示如题目的提示,然后会出现一大堆系统错误信息,如图 当时一脸懵逼,只能看懂一句:invalid pointer(无效的指针) 所以经过排查,发现有两句代码写的有问题,delete了不是new出来的指针,改掉就好了 以后要注意,delete/delete[]和new/new[]一定是配套使用原创 2017-11-14 22:22:14 · 34545 阅读 · 0 评论 -
C++中char *和char []的区别
以前一直觉得这两个有区别,但也没深究,今天写了个代码报了警告于是就看了看,总结如下。例如如下代码:#include<iostream>using namespace std;int main(){ char *p1 = "abcd"; char p2[] = "1234"; return 0;}“abcd”是在编译时刻就确定的,而“1234”是在运行时刻赋值的。 但原创 2017-12-05 11:16:06 · 13057 阅读 · 6 评论 -
c++类中使用signal函数
例子如下:using namespace std;class test{public: void a() { while ( 1 ) signal( SIGINT, change ); } void change( int sag ) { cout << "here\n"; }};int main原创 2018-03-12 20:03:58 · 9219 阅读 · 2 评论 -
c++类里初始化各种类型的数据成员
c++里初始化静态、非静态,const以及引用的数据成员各不相同静态成员初始化class a{private: static int i1 = 1; //错误 static int i2; //应该这么做 static const int i3 =2; //正确 int i4 = 1; //正确};int a::i2 = 1; //在这里定义 总结一下,在类原创 2018-03-30 11:37:12 · 3747 阅读 · 0 评论 -
fatal error: openssl/sha.h: 没有那个文件或目录
使用命令sudo apt-get install libssl-dev安装libssl-dev即可原创 2018-04-07 19:35:47 · 5500 阅读 · 0 评论 -
c++隐式的类类型转换
先看代码#include <iostream>#include <string>using namespace std;class Student{ string name; int number;public: Student(const string &str, int n = 1) : name(str), number(n) {} Student(原创 2018-04-01 11:50:07 · 715 阅读 · 0 评论 -
error : default argument given for parameter 2 of
今天碰到一个报错tree.cpp: In function ‘merkle_node* createMerkleNode(std::__cxx11::string, bool)’:tree.cpp:81:63: error: default argument given for parameter 2 of ‘merkle_node* createMerkleNode(std::__cxx11::原创 2018-04-09 20:23:13 · 4442 阅读 · 0 评论 -
区分operator++()是前缀还是后缀自增
当我们重载了++这个自增运算符,那么在调用他的时候,编译器如何知道我们是调用了前缀自增还是后缀自增呢#include <iostream>using namespace std;class tmp {private: int a;public: tmp(int b) { a = b; } tmp& operator++(); //这是前缀 const tmp原创 2018-04-11 00:05:45 · 1199 阅读 · 0 评论 -
cout的输出流顺序
C++中输入、输出用的是cin、cout,对应的有输入输出缓冲区,cin、cout都是对缓冲区中的数据进行操作,那么看下面代码:#include <iostream>using namespace std;int hello1();int hello2();int main() { int a, b; cout << "a=" << hello1() << endl <<原创 2017-09-27 21:39:42 · 785 阅读 · 0 评论