摘要:
1、为什么? 考虑下面的情况:方法声明为void processWidget(shared_ptr pw,int priority)。 调用方法 processWidget(shared_ptr (new Widget), getPriority()),在调用方法之前,要做三件事: a、执行new Widget b、调用shared_ptr的构造方法 c、调用方法getPriority() 可问题是:C++不保证上面的执行顺序(C#,Java保证)。那么问题就来了,如果是acb的执行顺序,并且c步骤异常,那么new出来的资源还没有放进资源管理类,导致内存泄漏。2、如何解决上面的问题... 阅读全文
posted @ 2014-01-09 20:44
Andy Niu
阅读(155)
评论(0)
推荐(0)
摘要:
简而言之,new时不带[],delete时也不带[];new时带[],delete时也要带[]。如果不匹配,要么造成多销毁对象,导致未定义行为;要么导致少销毁对象,导致内存泄漏。 阅读全文
posted @ 2014-01-09 20:03
Andy Niu
阅读(139)
评论(0)
推荐(0)
摘要:
1、为什么要这样做? 因为有的接口需要原始资源,比如方法void DoSth(const Person* p); 而现在我有一个shared_ptr person_ptr; 调用DoSth(person_ptr)编译失败,因为方法要一个Person指针,而person_ptr是一个对象。那怎么办?只能让资源管理类暴露资源。2、怎么暴露呢?两种办法:一种是提供显式方法,一种是隐式类型转换操作符:operator Person* () const ; 好像是一种特殊的方法:没有返回值,没有形参,重载了返回值的类型。根据准则:让接口容易被正确使用,不易被误用。应该使用显式方法,因为显式方法明确告诉. 阅读全文
posted @ 2014-01-09 19:56
Andy Niu
阅读(358)
评论(0)
推荐(0)
摘要:
1、为什么要使用资源管理类? 资源管理类的思路就是,栈上的对象,封装堆上分配的资源,确保一定会释放资源。auto_ptr和shared_ptr就是资源管理类,行为上像指针。2、auto_ptr和shared_ptr用来管理,堆上分配的内存,在auto_ptr和shared_ptr的析构方法中,执行delete。对于其他资源,auto_ptr和shared_ptr并不适合作为资源管理类。考虑互斥锁mutex,有普通方法lock和unlock,提供一个资源管理类Lock,管理mutex。资源管理类Lock被复制,将发生什么情况?该怎么办? a、禁止复制; b、采用引用计数法,也就是share... 阅读全文
posted @ 2014-01-09 19:33
Andy Niu
阅读(419)
评论(0)
推荐(0)
浙公网安备 33010602011771号