上一页 1 ··· 5 6 7 8 9 10 11 下一页
  2013年5月15日
摘要: 1)基本思想:对于大小为N的数组A,插入排序的基本思想是将位置为P的元素插入前面已排好序的从0到P-1的正确位置中,这样一来,从0到P的元素都是排好序的,接着对后面的元素做插入排序,所以总共需要N-1趟插入排序。下面的示例中初始数组为34 8 64 51 32 21,分别对P=1, 2...5位置的元素做插入排序,每一次排序结束后从0到P位置的元素都处于已排好序状态。 初始数组34 8 64 51 32 21描述P = 18 34 64 51 32 218需要移动P = 28 34 64 51 32 2164不需要移动P = 38 34 51 64 32 2151需要移动P = 48 32 . 阅读全文
posted @ 2013-05-15 20:00 Sophia-呵呵小猪 阅读(128) 评论(0) 推荐(0) 编辑
  2013年5月14日
只有注册用户登录后才能阅读该文。 阅读全文
posted @ 2013-05-14 18:22 Sophia-呵呵小猪 阅读(13) 评论(0) 推荐(0) 编辑
  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) 编辑
  2013年5月10日
摘要: 看下面一段代码:class Bitmap { ... }class Widget{ public: Widget& operaotr=(const Widget& wg); private: Bitmap* bp;}Widget& operator=(const Widget& wg){ delete bp; bp = new Bitmap(*wg.bp); return *this;}上面的一段简单的赋值函数,看上去逻辑很正确:首先释放掉bp所指的当前对象,然后将其指向新的对象,并返回指向this的引用。如果仔细分析,会发现存在下面两... 阅读全文
posted @ 2013-05-10 17:39 Sophia-呵呵小猪 阅读(258) 评论(0) 推荐(0) 编辑
  2013年5月9日
摘要: 1)当调用derived class的构造函数时,其基类的构造函数会先执行,在此期间,对象的类型被认为是base class对象,派生类对象成员变量处于未初始化状态,virtual调用不会下降至派生类中。2)当调用derived class析构函数时,其基类的析构函数先被调用,同理,在此期间的类型是base class对象,派生类成分处于未定义状态,C++视它们仿佛不存在,其他成员也同样这么看待,所以virtual函数不会下降至派生类中执行。 阅读全文
posted @ 2013-05-09 20:49 Sophia-呵呵小猪 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 1、构造函数可以抛出异常,但最好不要。2、c++标准指明析构函数不能、也不应该抛出异常。more effective c++关于第2点提出两点理由:1)如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。2)通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。解决办法:1)永远不要在析构函数抛出异常。2)通常第一点有时候不能保证。可以采取如下的方法:~ClassName(){ try{ 阅读全文
posted @ 2013-05-09 19:31 Sophia-呵呵小猪 阅读(229) 评论(0) 推荐(0) 编辑
  2013年5月4日
摘要: 对象的未初始化可能导致不明确的行为,因此一个良好的习惯是在使用任何对象之前先对其进行初始化。1)区别赋值和初始化在C++中,内置类型的初始化需要通过手工完成,否则需要调用对象的构造函数对每一个成员变量进行初始化,C++中规定:对象的成员变量的初始化动作发生在对象构造函数本体之前,因此下面构造函数中的代码就不是初始化而是赋值: 1 class PhoneNumber { ... } 2 class ABEntry 3 { 4 public: 5 ABEntry(const string& name, const string& addr, const list phones).. 阅读全文
posted @ 2013-05-04 17:29 Sophia-呵呵小猪 阅读(466) 评论(0) 推荐(0) 编辑
上一页 1 ··· 5 6 7 8 9 10 11 下一页