C/C++
文章平均质量分 80
C/C++
上官宏竹
这个作者很懒,什么都没留下…
展开
-
unordered_map详解和性能分析
std::unordered_map是C++标准库中的一个关联容器,它可以存储一组键值对,并且支持快速的查找、插入和删除操作。class Ty,std::hash是一个模板类,它接受一个类型参数T,用于指定需要哈希的对象类型。还提供了一个函数调用运算符(operator()),用于计算对象的哈希值。perator()接受一个常量引用key,用于指定需要计算哈希值的对象。它返回一个类型的哈希值,表示对象在哈希表中的桶位置。实现一个哈希函数。原创 2023-03-12 17:00:32 · 22405 阅读 · 1 评论 -
优先级反转问题及解决办法
优先级反转,是指在多线程的环境下,并且使用了信号量时,可能会出现的这样一种不合理的现象,即:高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。从现象上来看,好像是中优先级的任务比高优先级任务具有更高的优先权。具体来说:当高优先级任务正等待信号量(此信号量被一个低优先级任务拥有着)的时候,一个介于两个任务优先之间的中等优先级任务开始执行——这就会导致一个高优先级任务在等待一个低优先级任务,而低优先级任务却无法执行类似死锁的情形发生。原创 2023-01-04 22:56:23 · 2920 阅读 · 1 评论 -
Windows平台下的内存泄漏检测
Windows平台下面Visual Studio 调试器和 C 运行时 (CRT) 库为我们提供了检测和识别内存泄漏的有效方法,原理大致如下:内存分配要通过CRT在运行时实现,只要在分配内存和释放内存时分别做好记录,程序结束时对比分配内存和释放内存的记录就可以确定是不是有内存泄漏。原创 2023-01-01 22:19:54 · 1733 阅读 · 0 评论 -
C库函数
内存处理calloc函数原型:void *calloc(size_ t n, size_t size); 功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。 实现:http://blog.csdn.net/hzhzh007/article/details/6424638realloc函数原型:extern void原创 2015-11-07 21:16:40 · 589 阅读 · 0 评论 -
检测内存泄露、多线程gdb调试(core)、内核态用户态的通信
快速检测内存泄露通过包括 crtdbg.h,将 malloc 和 free 函数映射到它们的调试版本,即 _malloc_dbg 和 _free_dbg,这两个函数将跟踪内存分配和释放。此映射只在调试版本(在其中定义了_DEBUG)中发生。发布版本使用普通的 malloc 和 free 函数。在程序退出前调用:_CrtDumpMemoryLeaks();原创 2015-09-13 22:53:59 · 6698 阅读 · 1 评论 -
Linux内存分配原理
进程调用C=malloc(200K)以后,内存空间如图4:默认情况下,malloc函数分配内存,如果请求内存大于128K(可由M_MMAP_THRESHOLD选项调节),那就不是去推_edata指针了,而是利用mmap系统调用,从堆和栈的中间分配一块虚拟内存。这样子做主要是因为brk分配的内存需要等到高地址内存释放以后才能释放(例如,在B释放之前,A是不可能释放的),而mmap分配的内存可以单独释放。也就是说,如果用malloc分配了A这块内容,然后从来不访问它,那么,A对应的物理页是不会被分配的。原创 2022-12-17 17:43:30 · 995 阅读 · 0 评论 -
C++11新标准
构造函数参数依靠C++11提供的initializer_list类模板,即可以获得列表初始化时的参数列表。return 0;}public:People(initializer_list l) { // initializer_list的构造函数for (;i!= l.end();++i)}原创 2022-11-30 22:58:34 · 508 阅读 · 0 评论 -
C++模板
那么DequeStack和 Stack代表的是同一种类型。推断指引是用来提供额外的模板参数推断规则,或者修正已有的模板参数推断规则。比如你可以定义,当传递一个字符串常量或者 C 类型的字符串时,应该用 std::string实例化 Stack 模板类:这个指引语句必须出现在和模板类的定义相同的作用域或者命名空间内。通常它紧跟着模板类的定义。后面的类型被称为推断指引的”guided type”。现在,根据这个定义:聚合类(这样一类 class 或者 struct:原创 2022-11-09 17:55:02 · 379 阅读 · 0 评论 -
C++关键函数
拷贝构造函数的目的是用其它对象的数据来初始化当前对象,并没有期望更改其它对象的数据,添加 const 限制后,这个含义更加明确了。另外一个原因是,添加 const 限制后,可以将 const 对象和非 const 对象传递给形参了,因为非 const 类型可以转换为 const 类型。如果没有 const 限制,就不能将 const 对象传递给形参,因为 const 类型不能转换为非 const 类型,这就意味着,不能使用 const 对象来初始化当前对象了。原创 2022-11-06 20:18:33 · 107 阅读 · 0 评论 -
C++智能指针
智能指针也是一种模板类型,既然是类型,就依旧存在是栈空间还是堆空间上的问题。而如果这个智能指针是作为一个类的成员变量而存在,那么智能指针所管理的堆内存,是在这个类的实例析构时,析构这个成员变量时,决定是否释放智能指针所管理的堆内存的。lock成员获取到的shared_ptr shared_p指针,创建一个临时对象,这个临时对象同样指向shared_p,即使shared_p执了reset这样的delete引用的操作,弱引用对象仍然持有改智能指针的地址,直到r指针的生命周期结束才会释放。原创 2022-11-06 10:27:51 · 1145 阅读 · 0 评论 -
对于volatile的看法
volatile原意是易变的,编译器对volatile修饰的变量,当要读取这个变量时,任何情况下都会从内存中读取,而不会从寄存器缓存中读取。编译器不会对volatile修饰的变量进行任何优化。原创 2022-11-03 17:58:25 · 424 阅读 · 0 评论 -
记录一些C++用法
在类中定义,让这个别名归属于此类的范畴中。原创 2022-11-03 17:33:12 · 385 阅读 · 0 评论 -
C++函数中返回智能指针的裸指针问题
这里会得到一个临时智能指针变量,它生成临时变量时,计数器加1,函数返回后,这个临时变量会被销毁,此处计数器会减1,那么智能指针所指的内存会被释放,但是这里的释放不一定内存就没了,也不会马上就会被其他程序占用,所有此时这个get返回的地址就是一个野指针了。问题:如果使用智能指针的.get方法,获取一个裸指针返回,那么。2、或者使用std::move的方式移走,让指向的内存不被析构。作为一项案例分析下,C++函数中返回智能指针的裸指针问题。不要在函数中返回智能指针的裸指针出去!...原创 2022-09-01 16:10:41 · 1154 阅读 · 0 评论 -
VC++/MFC
1、_T(“hello world!”) _ T(“”)是一个宏,他的作用是让你的程序支持Unicode编码,而_ T和_ L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。原创 2015-03-16 16:41:40 · 402 阅读 · 0 评论 -
C/C++编译错误(原因&解决)
C++编译错误虚函数必须定义和实现【错误code】st9.cpp:(.text._ZN1AC2Ev[_ZN1AC5Ev]+0x8): undefined reference to `vtable for A'/tmp/cc4NCjpc.o:(.rodata._ZTV1B[_ZTV1B]+0x8): undefined reference to `A::f()'/tmp/cc4NCjpc.o:(.原创 2015-09-09 16:33:24 · 811 阅读 · 0 评论 -
C++异常处理
垃圾回收算法参考:C/C++中几种经典的垃圾回收算法构造和析构中的异常抛出1.1 抛出异常即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为: throw 表达式;如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型原创 2015-08-27 16:57:06 · 459 阅读 · 0 评论 -
C/C++编程规范
1、注意:strncpy、strncat等带n版本的字符串操作函数在源字符串长度超出n标识的长度时,会将包括’\0’结束符在内的超长字符串截断,导致’\0’结束符丢失。这时需要手动为目标字符串设置’\0’结束符。 char dst[11]; // 【注意】最好每次定义时初始化为0: dst[11] = {0}; char src[] = "0123456789"; ch......原创 2016-04-16 16:17:24 · 19974 阅读 · 0 评论 -
C/C++易错问题分析
1、若要通过函数参数传出值A,则需要传入A的指针形式传给函数形参的实参是作为拷贝传入,在函数体内改变作为拷贝的实参2是不会影响到传入的实参1的。 ex:void get_addr(int *p){ p = 0xEEFF;}void main(){ int *t = NULL; get_addr(t);} 应该改为如下的:void get_addr(int **p)原创 2016-04-18 19:22:35 · 477 阅读 · 0 评论 -
effectiveC++
条款1:尽量用const和inline而不用#define 条款3:尽量用new和delete而不用malloc和free malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。条款6:析构函数里对指针成员调用delete执行动态内存分配的的类都在构造函数里用new分配内存,然后在析构函数里用delete释放内存 删除空指针是安全的(因为它什么也没做)原创 2015-09-11 10:44:49 · 401 阅读 · 0 评论 -
C++primer——阅读笔记(非面向对象)
1、文件重定向$ a.out <infile >outfile 4、引用对于引用的操作,实际上是作用在引用所引的对象上。,使用引用作为参数有两个用处:1)避免拷贝 2)返回额外的值1、左值引用 【禁止返回局部对象的引用】const string & mainip(const string &s){ string ret = s; return ret; //返回后ret以及销毁原创 2015-07-26 22:21:11 · 576 阅读 · 0 评论 -
C++设计模式
设计模式C++实现单例模式1、简单的线程不安全的单例模式代码class CSingleton{private: CSingleton() //构造函数是私有的,外部将不能通过构造函数创建一个实例 { } static CSingleton *m_pInstance; //私有的、唯一的实例public: static CSingleton * Ge原创 2016-05-13 16:49:43 · 393 阅读 · 0 评论 -
WDDM学习
一、Windows Display Driver Model (WDDM)结构 WDDM的显示驱动模式框架,用于Vista以后的系统,是由用户模式和内核模式组成。下图显示了所支持的WDDM的框架。 图形硬件供应商必须支持用户模式显示驱动(user-mode display driver)和显示最小部件驱动(display miniport driver)。用户模式显示驱动是一个被Micros原创 2016-05-19 15:44:39 · 2745 阅读 · 0 评论