A* a=new B ,會不會產生內存泄露了,露了B-A的部分?

A* a=new B ,delete a;會不會產生內存泄露了,露了B-A的部分。其中B為A的子類

析構函數在下邊3種情況時被調用:
1.對象生命周期結束,被銷毀時;
2.delete指向對象的指針時,或delete指向對象的基類類型指針,而其基類虛構函數是虛函數時;
3.對象i是對象o的成員,o的析構函數被調用時,對象i的析構函數也被調用。

情況1請看下邊代碼:
#include<iostream.h>
class A
{
?public:
?A()
?{
??cout<<"constructing A"<<endl;
?}?
?~A()
?{
??cout<<"destructing A"<<endl;
?}
?private:
?int a;
};
class B: public A
{
?public:
?B()
?{
??cout<<"constructing B"<<endl;
?}
?~B()
?{
??cout<<"destructing B"<<endl;
?}
?private:
?int b;
};

void main()
{
?B b;
}

運行結果為:

constructing A
constructing B
destructing B
destructing A

上述代碼還說明了一件事:析構函數的調用順序與構造函數的調用順序相反。

情況2則正好說明了為什么基類應該把析構函數聲明為虛函數,請先看下邊的例子:

#include<iostream.h>
class A
{
?public:
?A()
?{
??cout<<"constructing A"<<endl;
?}?
?~A()
?{
??cout<<"destructing A"<<endl;
?}
?private:
?int a;
};
class B: public A
{
?public:
?B()
?{
??cout<<"constructing B"<<endl;
?}
?~B()
?{
??cout<<"destructing B"<<endl;
?}
?private:
?int b;
};

void main()
{
?A* a = new B;
?delete a;
}

運行結果為:

constructing A
constructing B
destructing A

若將class A中的析構函數聲明為虛函數,運行結果將變成:

constructing A
constructing B
destructing B
destructing A

由此還可以看出虛函數還是多態的基礎,才c++中沒有虛函數就無法實現多態。因為不聲明成虛函數就不能“推遲聯編”,所以不能實現多態。這點上和Java不同,java總是“推遲聯編”的,所以也剩了這些麻煩。

扯遠了,再看情況3,通過下邊代碼表示:
#include<iostream.h>
class A
{
?public:
?A()
?{
??cout<<"constructing A"<<endl;
?}
?~A()
?{
??cout<<"destructing A"<<endl;
?}
?private:
?int a;
};

class C
{
?public:
?C()
?{
??cout<<"constructing C"<<endl;
?}
?~C()
?{
??cout<<"destructing C"<<endl;
?}
?private:
??int c;
};

class B: public A
{
?public:
?B()
?{
??cout<<"constructing B"<<endl;
?}
?~B()
?{
??cout<<"destructing B"<<endl;
?}
?private:
?int b;
?C c;
};

void main()
{
?B b;
}

運行結果為:

constructing A
constructing C
constructing B
destructing B
destructing C
destructing A

b的析構函數調用之后,又調用了b的成員c的析構函數,同時再次驗證了析構函數的調用順序與構造函數的調用順序相反。

若將上邊的代碼中的main()函數內容改成

?A* a = new B;
?delete a;
?
由情況2我們知道,這將不會調用class B的析構函數不會被調用,所以class C的析構函數也不會被調用。
正如我們想的,運行結果為:

constructing A
constructing C
constructing B
destructing A

俗話說溫故而知新,我卻不想做什么師,只是希望能夠和大家分享一下對析構函數和虛析構函數的更深的認識。以上代碼在VC++6.0上測試通過,如有疏漏或錯誤的認識請大家指正:

轉載于:https://www.cnblogs.com/dobben/p/7440913.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454836.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454836.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454836.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring 第一天:1015

對象加強的三種方法&#xff1a;1/繼承2/裝飾著模式3/動態調用 2&#xff1a;裝飾著模式&#xff1a;就是就是1-先建一個基類 &#xff0c;如咖啡類 。味道很苦2- 再建一個類配料類 也就是說是所欲配料種類的父類。然后寫多配料子類個子類繼承配料類&#xff0c;。3-子類三個步…

java public 繼承_java繼承問題

代碼&#xff1a;父類&#xff1a;public class Father {public Father() {System.out.println("基類構造函數{");show();new a();System.out.println("}");}public void show() {System.out.println("基類----show");}public class a {public a…

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圓環數(數位DP+惡心細節)

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圓環數 Time Limit: 5 Sec Memory Limit: 64 MBDescription 正如你所知&#xff0c;奶牛們沒有手指以至于不能玩“石頭剪刀布”來任意地決定例如誰先擠奶的順序。她們甚至也不能通過仍硬幣的方式。 所以她們通過"round number&q…

Optimizing Code with GCC

現在的編譯器越來越聰明&#xff0c;功能越來越強&#xff0c;從簡單的函數內聯&#xff0c;到復雜的寄存器分析&#xff0c;一系列代碼革命使程序運行得越來越快。大多數時候&#xff0c;更快比更小重要&#xff0c;因為磁盤空間和內存都變得便宜了。但是在嵌入式系統里&#…

QTP的那些事--操作excel的函數

1: QTP Excel函數 操作EXCEL 數據表格 表單 編輯EXCEL 工作表 2: Dim ExcelApp As Excel.Application 3: Dim excelSheet As Excel.worksheet 4: Dim excelBook As Excel.workbook 5: Dim fso As scrīpting.FileSystemObject 6: 7: ******************…

java-生產者消費者模式

經常會有公司叫我們手撕代碼&#xff0c;比如網易&#xff0c;阿里&#xff0c;那我們是不是該掌握下呢。下面這段代碼來自《現代操作系統》進程與線程P49頁。 public class ProducerConsumer {public ProducerConsumer() { }private static final int N 100;static Producer …

yum查詢已經安裝mysql_通過yum安裝mysql

在linux中安裝數據庫首選MySQL&#xff0c;Mysql數據庫的第一個版本就是發行在Linux系統上&#xff0c;其他選擇還可以有postgreSQL&#xff0c;oracle等在Linux上安裝mysql數據庫&#xff0c;我們可以去其官網上下載mysql數據庫的rpm包&#xff0c;http://dev.mysql.com/downl…

koa2-cookie-session

node.js的path.extname方法使用   由于該方法屬于path模塊&#xff0c;使用前需要引入path模塊&#xff08;var path require(“path”) &#xff09;   接收參數&#xff1a;   p path 路徑 path.extname(index.html)// returns.htmlpath.extname(index.)// returns.pat…

從程序員角度看ELF

從程序員角度看ELF原文:《 ELF:From The Programmers Perspective》作者&#xff1a;Hongjiu Lu <mailto: hjlnynexst.com>NYNEX Science & Technology, Inc. 500 Westchester Avenue White Plains, NY 10604, USA 翻譯&#xff1a;alert7 <mailto: alert721cn.co…

JAVA命令符找不到符號_[轉]Java命令行編譯文件時出現的錯誤,找不到符號或軟件包不存在等...

標簽(空格分隔)&#xff1a; Javajavascript習慣了eclipse的自動編譯&#xff0c;Java命令行編譯、執行文件只會最基礎的部分&#xff0c;就是對單文件的編譯和執行&#xff0c;并且不包含任何外部JAR包。但有時候你還非得用命令行&#xff0c;會碰到一些問題&#xff0c;博主這…

C#中POST數據和接收的幾種方式

POST方式提交數據&#xff0c;一種眾所周知的方式&#xff1a; html頁面中使用form表單提交&#xff0c;接收方式&#xff0c;使用Request.Form[""]或Request.QueryString[""]來獲取。 這里介紹另外一種POST方式和接收方式&#xff0c;就是將整個數據作為加…

java自動注入注解_Spring自動注解標簽@Autowired不能注入xml配置的bean嗎?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓配置service的xmlservice代碼public class LoginServiceImpl extends BaseDaoServiceImpl implements LoginService {Overridepublic Map queryByUserName(String userName){IDao iDao super.getAppDao();return (Map)iDao.queryF…

一卡通vip充值消費線上oracle庫服務器故障排查過程

上圖是oracle體系總架構圖今天突然公司所有終端pos機不能刷卡消費&#xff0c;財務室不能充值&#xff0c;一下很多電話打過來了&#xff0c;第一反應肯定數據庫出問題了&#xff0c;登陸到數據庫服務器&#xff0c;果然sqlplus連進去后就不斷提示要求輸入用戶名&#xff0c;彈…

最詳細的Linux下C編程

gcc 目 錄 1. gcc 1. makefile寫法 2. gcc_egcs使用 3. gdb使用 4. gcc常用選項對代碼的影響 1. 一般情況 2. -O 編譯選項 3. -O2 編譯選項 4. -fomit-frame-pointer 編譯選項 5. -fomit-frame-pointer…

sqlserver 存儲過程 增加

CREATE PROCEDURE [dbo].[InsertMessage]( strTable varchar(50), --表名 strValues nvarchar(1000), --要插入的數據&#xff08;用英文逗號分隔&#xff09;,如果是字符串類型&#xff0c;需加單引號 only_field varchar(20)NULL, --唯一性字段(列名) only_valu…

java開發計算機考試服務器_2011計算機二級JAVA編程:取得服務器當前的各種具體時間...

取得服務器當前的各種具體時間/*** 取得服務器當前的各種具體時間* 回車&#xff1a;日期時間*/import java.util.*;public class GetNowDate{Calendar calendar null;public GetNowDate(){calendar Calendar.getInstance();calendar.setTime(new Date());}public int getYea…

(cljs/run-at (JSVM. :all) 細說函數)

前言 作為一門函數式編程語言&#xff0c;深入了解函數的定義和使用自然是十分重要的事情&#xff0c;下面我們一起來學習吧&#xff01; 3種基礎定義方法 defn 定義語法 (defn name [params*]exprs*) 示例 (defn tap [ns x](println ns x)x) fn 定義語法 (fn name? [params*]…

Request的getHeader()和getParameter()的區別

區別是&#xff1a;一個是獲得HTTP頭信息,一個是獲得表單參數值。轉載于:https://www.cnblogs.com/pxffly/p/7460514.html

gcc中的內嵌匯編語言(Intel i386平臺)

gcc中的內嵌匯編語言&#xff08;Inteli386平臺&#xff09; 一.聲明 雖然Linux的核心代碼大部分是用C語言編寫的&#xff0c;但是不可避免的其中還是有一部分是用匯編語言寫成的。有些匯編語言代碼是直接寫在匯編源程序中的&#xff0c;特別是Linux的啟動代碼部分&#xff1b…

數據庫學習,樹形結構的數據庫表Schema設計方案

2019獨角獸企業重金招聘Python工程師標準>>> 程序設計過程中&#xff0c;我們常常用樹形結構來表征某些數據的關聯關系&#xff0c;如企業上下級部門、欄目結構、商品分類等等&#xff0c;通常而言&#xff0c;這些樹狀結構需要借助于數據庫完成持久化。然而目前的各…