• 解读 C 语言中的指针

    Posted by : lon.y@qq.com on 2017年7月4日

    我想对很多学习C语言的新手来说,指针无疑是一个难点。但是,我觉得指针也是C语言特别重要的一个特性。也许,你在除了C和C++以外的编程语言中,很少看到指针。而C++中,也多用引用,而非指针。指针,作为一种高效的工具,可谓是一把双刃剑——用得好,可以大大提高程序效率,但用的不好,就是很多bug的滋生地。 这或许也是人们对指针褒贬不一的原因吧。就我个人而言,我还是很喜欢这个特性,因为我需要经常和硬件以及一些底层的软件打交道。这个时候,指针便体现出它独特的魅力。指

    阅读全文...

  • 图说C++对象模型:对象内存布局详解

    Posted by : lon.y@qq.com on 2017年7月4日

    0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可能有所不同。 文章如果有解释不清、解释不通或疏漏的地方,恳请指出。 1.何为C++对象模型? 引用《深度探索C++对象模型》这本书中的话: 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分。 对于各种支持的底层实现机制。 直接支持面向对象程序

    阅读全文...

  • 有了垃圾回收,还会不会发生内存泄漏?

    Posted by : lon.y@qq.com on 2017年7月4日

    问题的发现 这个问题是我在写C++时考虑到的,C++需要手动管理内存,虽然现在标准库中提供了一些智能指针,可以实现基于引用计数的自动内存管理,但现实环境是很复杂的,我们仍要注意循环引用的问题。还有一个容易被忽视的问题就是对象间关系的“占有”和“非占有”,这个问题其实在具有GC的C#和Java中也一样存在。 目前.NET和Java的GC策略都属于Tracing garbage collection,基本原理是从一系列的root开始,沿着引用链进行遍历,对遍历

    阅读全文...

  • C++ 之 stl::string 写时拷贝导致的问题

    Posted by : lon.y@qq.com on 2017年7月4日

    前几天在开发某些数据结构到文件的 Dump 和 Load 功能的时候, 遇到的一个 bug 。 问题复现 问题主要出在 Load 过程中,从文件读取数据的时候, 直接使用 fread 的去操作 string 的内部指针地址 (char*)s.c_str() 。 简化后的示例代码如下(testdata1文件内容是12345): void Load(string& s, size_t offset, size_t size) { s.resize(si

    阅读全文...

  • C++11 新特性之类型推断与类型获取

    Posted by : lon.y@qq.com on 2017年7月4日

    C++11新特性之新类型与初始化: http://blog.jobbole.com/102728/ 这是C++11新特性介绍的第二部分,涉及到C++11这次更新中较为重要的特性类型推断(auto)与类型获取(decltype)。 不想看toy code的读者可以直接拉到文章最后看这部分的总结。 简单的类型推断 C++11新标准中增加了auto类型说明符,可以让编译器帮我们分析表达式的类型。 double val1 = 1.1, val2 = 2.2; au

    阅读全文...

  • C++11 新特性之智能指针

    Posted by : lon.y@qq.com on 2017年7月4日

    前四篇在这里: C++11新特性之新类型与初始化:  http://blog.jobbole.com/102728/ C++11新特性之类型推断与类型获取:  http://blog.jobbole.com/104559/ C++11新特性之lambda:http://blog.jobbole.com/104548/ C++11新特性之容器相关特性: http://blog.jobbole.com/104563/ 这是C++11新特性介绍的第五部分,涉及到

    阅读全文...

  • C++ 线程池实现原理

    Posted by : lon.y@qq.com on 2017年7月4日

    背景 多线程编程是C++开发者的一个基本功, 但是很多开发者都是直接使用公司给包装好的线程池库, 没有去了解具体实现,有些实现也都因为高度优化而写得讳莫如深,让初学者看得吃力。 所以写这篇文章主要是想以非常简单的方式讲讲实现原理, 希望初学者看完之后不是觉得「不明觉厉」,而是觉得「原来如此」。 面朝代码 首先先来一段超级简单(注释丰富)的代码展示多线程编程的经典写法。 注: 该段代码和完整运行示例请见 limonp-thread-pool-programm

    阅读全文...

  • C++11 新特性之 lambda

    Posted by : lon.y@qq.com on 2017年7月4日

    前两篇在这里: C++11新特性之新类型与初始化: http://blog.jobbole.com/102728/ C++11新特性之类型推断与类型获取: http://blog.jobbole.com/104559/ 这是C++11新特性介绍的第三部分,涉及到C++11这次更新中较为重要的lambda表达式。 不想看toy code的读者可以直接拉到文章最后看这部分的总结。 lambda 简介 熟悉Python的程序员应该对lambda不陌生。简单来说,

    阅读全文...

  • C++ 11 常用特性的使用经验总结

    Posted by : lon.y@qq.com on 2017年7月4日

    C++11已经出来很久了,网上也早有很多优秀的C++11新特性的总结文章,在编写本博客之前,博主在工作和学习中学到的关于C++11方面的知识,也得益于很多其他网友的总结。本博客文章是在学习的基础上,加上博主在日常工作中的使用C++11的一些总结、经验和感悟,整理出来,分享给大家,希望对各位读者有帮助,文章中的总结可能存在很多不完整或有错误的地方,也希望读者指出。大家可以根据如下目录跳到自己需要的章节。 1、关键字及新语法 C++11相比C++98增加了许多

    阅读全文...

  • 如何在 Linux 下检测内存泄漏

    Posted by : lon.y@qq.com on 2017年7月4日

    1.开发背景 在 windows 下使用 VC 编程时,我们通常需要 DEBUG 模式下运行程序,而后调试器将在退出程序时,打印出程序运行过程中在堆上分配而没有释放的内存信息,其中包括代码文件名、行号以及内存大小。该功能是 MFC Framework 提供的内置机制,封装在其类结构体系内部。 在 linux 或者 unix 下,我们的 C++ 程序缺乏相应的手段来检测内存信息,而只能使用 top 指令观察进程的动态内存总额。而且程序退出时,我们无法获知任何

    阅读全文...