第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定

沒有學(xué)不會的C++:虛析構(gòu)函數(shù)和智能指針

標(biāo)簽:
C++

虚析构函数

当我们想在程序中实现多态时,我们经常会这样做:

#include <iostream>
using namespace std;
class Dog {
public:
  Dog() {}
  ~Dog() { cout << "Dog destroy\n";}
};

class YellowDog : public Dog {
public:
  YellowDog() {}
  ~YellowDog() { cout << "YellowDog destroy\n";}
  static Dog* createDog() { return new YellowDog(); }
};

即用工厂类或工厂方法来创建具体的对象,而在运行时通过对基类(这里是Dog)的指针或引用来实现对不同子类(这里是YellowDog)的调用,这样我们就实现了「多态」。不过,上面代码是有问题的,你可以看下面代码的输出:

int main(int argc, char** argv) {
  Dog* dog = YellowDog::createDog();
  delete dog;
  return 0;
}
----<output>----
Dog destroy

从输出结果可以看出,delete dog 时,只调用了基类的析构函数,而子类对象没有被析构,此时很可能会发生内存泄露,为了避免这种情况,我们需要在基类析构函数前加上 virtual 关键字,如下

virtual ~Dog() { cout << "Dog destroy\n"; }

接着重新编译后再运行程序,便可以看到子类对象被如期析构了

----<output>----
YellowDog destroy
Dog destroy

用智能指针 shared_ptr 实现动态析构

从 C++ 11 起,通过 shared_ptr 你同样可以实现动态析构,shared_ptr 定义在头文件 <memory>

template< class T > class shared_ptr;

下面我们就来看下智能指针的版本

class Dog {
public:
  Dog(){}
  ~Dog() { cout << "Dog destructor" << endl; }
};

class YellowDog : public Dog {
public:
  YellowDog() {}
  ~YellowDog() { cout << "YellowDog destructor" << endl; }

  static shared_ptr<Dog> createDog() {
      return shared_ptr<YellowDog>(new YellowDog());
  }
};

int main() {
    shared_ptr<Dog> p = YellowDog::createDog();
    return 0;
}

从输出中可以看到虽然 Dog 类中的析构函数没有声明 virtual,但 YellowDog 的析构函数仍然被顺利调用了。

注意:STL 中的所有类都没有 virtual 析构函数,所以当你从 STL 中派生子类时,要尽可能的使用 shared_ptr

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消