2013年5月13日
摘要: 前面有提过可以通过智能指针管理资源来避免内存泄漏,但是在下面的代码中,仍有可能发生内存泄漏:int priority();ProcessWidget(std::tr1::shared_ptr<Widget> pw(new Widget()), priority())在ProcessWidget正式执行前,编译器还需要先完成以下三件事:1) new Widget();2) priority();3) 调用std::tr1::shared_ptr<Widget>的构造函数不同于Java或C#的顺序执行,在C++中,上面的三件事的执行顺序并不一定,如果编译器刚好按照上面的顺序 阅读全文
posted @ 2013-05-13 21:31 Sophia-呵呵小猪 阅读(215) 评论(0) 推荐(0) 编辑
摘要: C++中使用new和delete操作符动态分配和释放内存,当使用new时,有两件事会发生:1)分配出内存;2)针对该内存会有一个(或多个)构造函数调用来初始化对象。当使用delete时,对应的发生两件事:1)针对该内存调用一个或多个析构函数;2)释放掉该内存。 阅读全文
posted @ 2013-05-13 21:06 Sophia-呵呵小猪 阅读(157) 评论(0) 推荐(0) 编辑
摘要: C++中用对象管理资源的主要目的是为了利用C++的“自动调用析构函数”的机制来避免内存泄漏。上一节中提到可以用智能指针或者计数型智能指针作为对象来管理资源,这两个类指针对象包含了一个get成员函数用于返回其内部的原始指向资源的指针,这是由对象到原始指针的显式转换,此外,它们还可以通过指针取值操作符(.和->)来实现隐式转换。通常,用对象管理资源时,都应在对象中包含获取原始指针的方法,这种方法可以是显式或是隐式的,显示的转换比较安全,隐式有可能会与预期的结果相遍悖,但用户用起来更方便,使用时需要根据情况具体处理。以上整理自Effective C++第三版case 15. 阅读全文
posted @ 2013-05-13 20:47 Sophia-呵呵小猪 阅读(93) 评论(0) 推荐(0) 编辑
摘要: 请先看下面的代码:class Investment { ... };void f(){ Investment* pInv = createInvestment();//factory function ... delete pInv;}其中Investment是作为多态用途的基类,函数f中通过一个工厂函数创建了一个对象,使用结束后通过delete释放资源。这里需要注意的问题是如果f中的程序无法正常执行到pInv,例如提前return,抛出异常等,那么pInv所指向的资源就不能被正确释放,且该对象所保存的资源也不能被释放,因而可能会造成很严重的资源泄漏。为了解决上面这个问题,可... 阅读全文
posted @ 2013-05-13 10:24 Sophia-呵呵小猪 阅读(155) 评论(0) 推荐(0) 编辑