C++以对象管理资源】的更多相关文章

以对象管理资源 通过对象的析构函数的自动调用来自动释放资源 第一部分:几种典型的以对象管理资源的例子 1. STL::auto_ptr 获取资源后立刻放入资源管理对象 std::auto_ptr<Investment> pInv(createInvestment()); 当pInv生命周期结束时,自动释放资源 注意:auto_ptr有一个奇怪的性质:不会有多个auto_ptr同时指向同一个资源. std::auto_ptr<Investment> pInv2(pInv); // p…
这一节基本讲述的是将资源放进管理对象,防止忘记释放资源. 1.一般New和Delete使用场景 void fun() { SimpleClass* pSimpleClass1 = new SimpleClass; .... // 如果这中间发生异常返回,则delete pSimpleClass1将不会被执行,造成内存泄漏 delete pSimpleClass1; SimpleClass* pSimpleClass2 = createSimpleClass(); .... // 如果这中间发生异…
条款 13 :以对象管理资源 例:      voidf()      {           Investment *pInv = createInvestment();           ...                  //这里存在诸多“不定因素”,可能造成delete pInv:得不到执行,这可能就存在潜在的内存泄露.          delete pInv;      }  解决方法:把资源放进对象内,我们便可依赖C++的“析构函数自动调用机制”确保资源被释放.     许…
auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象.auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时,动态分配的对象会被自动释放.auto_ptr为动态分配内存提供了大量的便利和安全性.通过使用auto_ptr,程序员不再需要关心new出来的对象何时delete,而且在子程序异常跳出时仍能保证动态分配的对象正常析构. 在使用auto_ptr之前,必须包含以下的头文件: #include<memory…
三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket等. 1.        以对象管理资源       void f() {     investment *plv = createInvestment();     //这里存在很多不定因素,可能造成下面语句无法执行,这就存在资源泄露的可能.     delete plv; }      这里我们…
如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> using namespace std; class Investment { public: }; class InvestmentFactory { public: virtual Investment* createInvestment() { Investment * inV = NULL; return…
C++相比Java等含有gc的语言来说,内存管理方面(也包括资源管理)比较令人头疼.一些初级程序员,甚至是一些经验丰富的老程序员,也会经常在资源管理上犯错.这时候就需要一个能够自动管理资源的东西(gc),但是由于C++本身没有提供,那么只有我们自己实现了. 本节我不打算直接按照<Effective C++>本节的内容进行写作,而是手动实现一个智能指针(想想还有些小激动呢^_^). 首先,我们先编写一个测试代码(先写测试代码总是一个好习惯): //test.h #pragma once #inc…
问题聚焦: 从这条准则开始,都是关于资源管理的. 资源,一旦用了它,将来必须还给系统. 本条准则,基于对象的资源管理办法,建立在C++的构造函数,析构函数和拷贝函数(拷贝构造函数和重载赋值操作符)的基础上. Demo: root class Investment: class Investment { ... }; // 工厂函数 Investment* createInvestment(); // 返回指向一个Investment或者其子类的对象,调用者有责任删除它 // 考虑如下调用 voi…
为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII classes 分别是tr1::shared_ptr和auto_ptr.前者通常是较佳选择,因为其copy行为比较直观.若选择auto_ptr,复制动作会使它(被复制物)指向null.…
先看下面一段代码: class Node {}; Node* CreateNode() { } void Solve() { Node *p=CreateNode(); //调用CreateNode函数 ... delete p; //释放资源 } 这样释放资源(delete)做法是正确的. 但是,我们怎么能保证其他人在利用这个代码时在delete之前会不会使用continue语句或者return语句跳过delete,这样一来的话不就无法释放资源浪费资源了吗. 有什么办法呢?即在程序结束之前一定…