2014年1月24日
摘要: 原文:http://blog.csdn.net/c504665913/article/details/7797859如果一个人自称为程序高手,却对内存一无所知,那么我可以告诉你,他一定在吹牛。用C或C++写程序,需要更多地关注内存,这不仅仅是因为内存的分配是否合理直接影响着程序的效率和性能,更为主要的是,当我们操作内存的时候一不小心就会出现问题,而且很多时候,这些问题都是不易发觉的,比如内存泄漏,比如悬挂指针。笔者今天在这里并不是要讨论如何避免这些问题,而是想从另外一个角度来认识C++内存对象。 我们知道,C++将内存划分为三个逻辑区域:堆、栈和静态存储区。既然如此,我称位于它们之中的对象分. 阅读全文
posted @ 2014-01-24 20:04 Andy Niu 阅读(4444) 评论(0) 推荐(1) 编辑
摘要: 原文:http://www.cnblogs.com/wanghetao/archive/2011/11/21/2257403.html1. placementnew的含义placementnew是重载operatornew的一个标准、全局的版本,它不能够被自定义的版本代替(不像普通版本的operatornew和operatordelete能够被替换)。void*operatornew(size_t,void*p)throw(){returnp;}placementnew的执行忽略了size_t参数,只返还第二个参数。其结果是允许用户把一个对象放到一个特定的地方,达到调用构造函数的效果。和其他普 阅读全文
posted @ 2014-01-24 20:02 Andy Niu 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 1、【50】讲了,有很多理由需要写个自定义的new/delete,自定义new/delete的时候,需要遵守一些规则。2、循环申请,直到成功或者抛出异常,如下: 1 void* operator new (std::size_t size) throw() 2 { 3 if(size=0) 4 { 5 size =1; 6 } 7 while (true) 8 { 9 if(分配成功)10 {11 ... 阅读全文
posted @ 2014-01-24 19:57 Andy Niu 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 1、有时候,我们替换掉编译器提供的new或者delete。首先思考,为什么想要替换?下面是三个常见理由: a、用来检测运用上的错误,超额分配一些内存,再额外的空间放置一些内存; b、为了强化效能,编译器提供的new/delete是通用的,通用就意味着冗余和效率低下,为什么?这个很好理解,因为他要支持很多情况下,也必须考虑很多情况。我们重写new/delete,也就是说,对于特定情况,给出特定的实现。 c、为了收集使用上的统计数据。 阅读全文
posted @ 2014-01-24 19:39 Andy Niu 阅读(481) 评论(0) 推荐(0) 编辑
摘要: 1、使用operator new无法获取内存时,对于旧式编译器,会返回一个null指针。对于新式编译器,会抛出一个异常。2、考虑下面的需求,当operator new 无法获取内存时,程序员期望获得通知,并调用一个方法。也就是说,向系统传递一个回调方法。这就是new_handler: typedef void (* new_handler) (void); new_handler是一个指针方法,形参为空,没有返回值。 new_handler set_new_handler(new_handler p) throw (); set_new_handler 方法就是传递一个回调方法,返回老的... 阅读全文
posted @ 2014-01-24 19:18 Andy Niu 阅读(379) 评论(0) 推荐(0) 编辑
摘要: 1、Widget* pw = new Widget; 调用了两个方法:第一个方法是operator new 负责分配内存;第二个方法是在分配的内存上构造Widget,即调用Widget的default构造方法。2、那么问题来了,如果operator new分配内存成功,而Widget构造抛出异常,这种情况下,pw还没有赋值,这不就导致资源泄露了? 不会造成资源泄露,因为C++运行系统保证调用delete释放资源。3、正常的operator new 如下: void* operator new(std::size_t) throw (std::bad_alloc); 正常的operator... 阅读全文
posted @ 2014-01-24 18:44 Andy Niu 阅读(458) 评论(0) 推荐(1) 编辑