代码改变世界

[C++再学习系列] STL容器删除操作总结

2011-01-30 12:01 by zhenjing, 2764 阅读, 1 推荐, 收藏, 编辑
摘要:由于容器所对应不同的迭代器、指针和引用的失效规则,使得容器的删除操作较为复杂。解决问题的最好方法取决于你是怎样鉴别出哪个对象是要被去掉的,储存它们的容器的类型,和当你删除它们的时候你还想要做什么。 阅读全文

[C++再学习系列] 函数声明与STL容器构造

2011-01-28 10:56 by zhenjing, 1334 阅读, 0 推荐, 收藏, 编辑
摘要:C++有一条通用规则——几乎任何东西都可能被分析成函数声明。如果使用不当,这个规则将引发“声明错误”,将声明被当成函数来解析。这种现象在STL容器的使用中最常见。 阅读全文

[转载] 内存越界和泄露调试工具

2011-01-26 14:52 by zhenjing, 3027 阅读, 1 推荐, 收藏, 编辑
摘要:valgrind的介绍性文章,非常好的内存检查工具,且不止为内存工具。 阅读全文

[转载] 内存越界

2011-01-26 14:45 by zhenjing, 21626 阅读, 1 推荐, 收藏, 编辑
摘要:讨论Linux下,常见的内存问题: 1.内存重复释放,出现double free时,通常是由于这种情况所致。 2.内存泄露,分配的内存忘了释放。 3.内存越界使用,使用了不该使用的内存。 4.使用了无效指针。 5.空指针,对一个空指针进行操作。 常见的错误信息: *** glibc detected *** free(): invalid pointer: *** glibc detected *** malloc(): memory corruption: *** glibc detected *** double free or corruption (out): 0x00000000005c18a0 *** *** glibc detected *** double free or corruption (!prev): 0x0000000000a01f40 *** *** glibc detected *** corrupted double-linked list: 0x00000000005ab150 *** 阅读全文

[C++再学习系列] 函数模板和类模板

2011-01-25 12:51 by zhenjing, 1213 阅读, 0 推荐, 收藏, 编辑
摘要:函数模板和类模板C++提供类模板和函数模板。函数模板允许重载,而类模板不允许重载(类无重载概念)。类模板可以进行全特化和偏特化,而函数模板仅能够全特化。因此,写一个看似函数模板偏特化的函数模板实际上是在写一个单独的主函数模板!由于函数模板可以重载,因此存在重载决议。但是记住,函数模板特化并不参与重载。只有在某个主模板函数被重载决议选中的前提下,其特化版本才有可能被使用。因此,如果想要将一个主模板特化,同时希望该特化版本能够参与重载决议,那么应该将使用普通函数而不是特化版本。(这是因为普通函数比函数模板优先级更高)如果希望函数模板可以被特化、偏特化,应该使用类模板来封装。类模板可以被偏特化。总结:函数模板不能偏特化只能重载,函数模板的特化并不参与重载决议。这和直觉有点不同。注意:1. 对于模板函数。不能使用默认参数。默认参数仅仅对模板类有效。2. 在编写模板函数的过程中。函数体内所有使用到的类型都必须是已知的(当然对于template中的参数类型。在函数体内也属已经的类型)。就是说不能在函数体内使用新定义的类型。如果使用像迭代器这样的特化类型,需要使用typename 做限定。 阅读全文

[C++再学习系列] 模板函数的自定义点

2011-01-24 12:00 by zhenjing, 1193 阅读, 1 推荐, 收藏, 编辑
摘要:在编写模板时,可以通过一些显示的自定义,对模板参数类型做一些必要的限制: 选择1: 模板直接依赖于类型具有给定名字的合适的成员函数, 则显式要求参数T提供该成员函数. 选择2: 模板依赖于”类型具有给定名字的合适的非成员函数”, 则显式的要求T具有给定名字/签名和语义的非成员函数. 选择3: 模板依赖于”类型已经特化(如果必要)另一个模板”, 则需要被特化的模板提供一个(通常是静态类成员)具有给定名字/签名和语义的函数. 阅读全文

[C++再学习系列] typename和依赖类型

2011-01-21 13:54 by zhenjing, 1332 阅读, 0 推荐, 收藏, 编辑
摘要:template class Widget { ... }; class和typename均可用于声明模板的形式类型参数,但typename能更清楚地表示:T可以是任何类型;不必是一个类。为了避免潜在的模糊解析,编译器要求在依赖形式类型参数的类型名字之前使用typename。这样的类型被称为依赖类型。常见例子如容器迭代器。 阅读全文

How to create a size-limited file-system

2011-01-18 15:57 by zhenjing, 427 阅读, 0 推荐, 收藏, 编辑
摘要:在特定情况下(如测试),需要建立大小受限的文件夹,最简单的办法莫过于使用linux提供的Loopback设备。Loopback文件系统就是把一个文件和另外的一个文件系统联系起来,就像一个完整文件系统一样。它可以被格式化和mount成以上所提到过的文件系统。这样,这些设备就被称为/dev/loop0或者/dev/loop1,然后和文件产生联系,然后这个虚拟设备被mount。 阅读全文

[C++再学习系列] 深入new/delete:类域的operator new重载

2011-01-17 11:23 by zhenjing, 3178 阅读, 1 推荐, 收藏, 编辑
摘要:为class 重载 operator new 时必须定义为类的静态函数(默认为static函数)。重载operator new更多的是为了提高程序效率,比如使用静态内存代替动态分配,启用小对象分配器等。但是要正确重载类域的operator new并不容易,有很多规则需要注意:1) 总是成对提供new/delete;2) 如重载operator new一定要同时提供标准形式的new。 阅读全文

[C++再学习系列] 深入new/delete:Operator new的全局重载

2011-01-13 12:01 by zhenjing, 1522 阅读, 0 推荐, 收藏, 编辑
摘要:我们经常看到这么一句话:operator new可以重载,placement new不可重载。其实此处所说的不可重载应该是指全局的placement new不可重载,对于类域中的placement new是可以重载的。重载operator new规则:重载operator new 的参数个数是可以任意的, 只需要保证第一个参数为 size_t, 返回类型为 void * 即可, 而且其重载的参数类型也不必包含自定义类型. 更一般的说, operator new 的重载更像是一个函数的重载, 而不是一个操作符的重载。 阅读全文
上一页 1 ··· 6 7 8 9 10 11 12 13 14 15 下一页