向上引用時new建立的物件的析構
假設Employee是基類,Singer是派生類,並新增一個char*成員,該成員指向有new分配的記憶體。
下面的程式碼:
Employee *pe = new Singer;
delete pe;
如果使用預設的靜態編譯,delete語句將呼叫~Employee()解構函式。這將釋放由Singer物件中的Employee部分指向的記憶體,但不會釋放新的類成員指向的記憶體。
但如果解構函式是虛的,則上述程式碼將先呼叫~Singer解構函式釋放由Singer元件指向的記憶體,然後呼叫~Employee()解構函式來釋放由Employee元件指向的記憶體。
這意味著,即使基類不需要顯示解構函式提供服務,也不應依賴於預設建構函式,而應提供虛解構函式,即使它不執行任何操作:
virtual ~BaseClass(){}
順便說一句,給類定義一個虛解構函式並非錯誤,即使這個類不作基類;這只是一個效率方面的問題。
提示:通常應該給基類提供一個虛解構函式,即使它並不需要解構函式。可以為以後拓展類組合繼承打下基礎。
相關推薦
向上引用時new建立的物件的析構
假設Employee是基類,Singer是派生類,並新增一個char*成員,該成員指向有new分配的記憶體。 下面的程式碼: Employee *pe = new Singer; delete pe; 如果使用預設的靜態編譯,delete語句將呼叫~Employee()解構函式。這將釋放
c++採用new建立物件陣列
object *p = new object[3]; p[0] = p[1] = 上述情況是否需要定義建構函式? new object不對物件進行初始化。 new object(parameters)顯示呼叫建構函式初始化物件。 如果沒有定義預設建構函
swoole_process原始碼解析之物件析構
swoole_process提供了__destruct方法,用於釋放swoole內部物件資源,這個會在swoole_process物件釋放時呼叫。 我們看下其流程。 static PHP_METHO
用關鍵字new建立物件 new都做了什麼(隨筆)
function Person () { this.name = name; this.age = age; this.job = job; this.sayName = function () { return this.
new建立物件和直接定義的區別
MyClasee myclass; 這裡是一個空引用,而通過new關鍵字可以例項化一個MyClasee的例項, 所以語句: myclass = new MyClass(); 2.棧,放的是區域性變數,他的生存期就是他所處的語句塊(也就是離他最近的一對{}),離開了他的生存期他就失效了,一般宣告形式
--轉載 物件析構談—— delete this 的使用及注意事項
In order to understand "delete this" : First Step - dive into "delete p" delete p 執行了哪些步驟? delete p 是一個兩步的過程:呼叫解構函式(釋放類裡邊涉及new的記憶體),然後釋放記憶體(類本身佔的記
Spring 註解 new建立物件後失效
遇到這麼一個情況,想寫一個Util工具類用於記錄操作日誌,在無法使用static關鍵字情況下,使用new來建立物件,隨後執行一直報異常, java.lang.NullPointerException at net.wrtrd.adsystem.sql.dao
Class.forName的作用及用newInstance()和new建立物件的區別
Class.forName(xxx.xx.xx) 返回的是一個類 首先你要明白在java裡面任何class都要裝載在虛擬機器上才能執行。這句話就是裝載類用的(和new 不一樣,要分清楚)。 至於什麼時候用,你可以考慮一下這個問題,給你一個字串變數,它代表一個類的包名和
定義一個String物件直接使用“=”賦值 與 new 建立物件賦值 有何區別?
經常在java程式設計師面試的過程中,面試官經常會問到下面這個問題:String strA = "abc"; String StrB = new String("abc");這兩行程式碼中分別建立了幾個物件?【答案】第一行程式碼建立了1個物件,第二行程式碼建立了2個物件;【解
java中用new建立一個物件的過程解析
java中用new建立一個物件的過程解析 對於用new 建立一個物件,我們需要弄清楚它的過程: 引用和建立一個物件的格式是: 類名 變數名; 變數名=new 類名(引數列表); 比如 Vehicle veh1=new Vehicle(); 這個語句具體的執行過
DLL中物件的構造與析構
動態連結庫中全域性變數的構造與析構: 背景:你在當前main函式中通過LoadLibrary來載入MFCLibraryDll.dll 1 MFCLibraryDll中的全域性變數A b的建立與析構會自動執行: 1)LoadLibrary執行時第一時間建立LoadLibrary中的全域
SGISTL原始碼閱讀四 物件的構造與析構
SGISTL原始碼閱讀四 物件的構造與析構 前言 前面我們提到,SGISTL將空間配置和物件的構造分開操作了,前面的文章我們對空間配置已經做了描述,下面我們來看一下如何構造和析構物件。 深入原始碼 construc //接受一個指標和一個初值 template <c
建立物件時,=null 和new的區別
1.=null只是宣告一個物件,並不實際佔用空間。 如:HBPWDto hbpwDto = null; 相當於HBPWDto hbpwDto ; 2.new,把物件例項化了,這個物件會一直佔用空間(雖然不一定使用),直到被回收。 如果只是做賦值操作,只需要宣告就行了 ,在需要的時候再賦予
【C++】建立物件之new關鍵字
起初剛學C++時,很不習慣用new,後來看老外的程式,發現幾乎都是使用new,想一想區別也不是太大,但是在大一點的專案設計中,有時候不使用new的確會帶來很多問題。當然這都是跟new的用法有關的。new建立類物件,使用完後需使用delete刪除,跟申請記憶體類似。所以,new有時候又不太適合,比如在
c# 未將物件引用設定到物件的例項 使用“new”關鍵字建立物件例項。在呼叫方法前通過檢查確定物件是否為null
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; u
String a = "abc";和String b = new String("abc")建立物件
String a = "abc"; 首先會在棧中建立一個對String類物件的引用變數a,然後去查詢字串常量池中是否有"abc"。如果有,會把a指向這個物件的地址。如果字串常量池中沒有"abc",則在棧中建立三個char型的值'a','b','c',然後在堆中建立一個Stri
C++物件模型:構造、析構、拷貝語意學
目錄 1、有關純虛擬函式 2、無繼承情況下的函式構造 2.1struct 構造 2.2抽象資料型別 2.3有虛擬函式的情況 3.繼承體系下的物件構造 3.1概述 3.2虛擬繼承的情況 3.3vptr的初始化 4.物件複製語意學 5.解構函式語意學
C++用new和不用new建立類物件區別
new建立類物件,使用完後需使用delete刪除,跟申請記憶體類似。所以,new有時候又不太適合,比如在頻繁呼叫場合,使用區域性new類物件就不是個好選擇,使用全域性類物件或一個經過初始化的全域性類指標似乎更加高效。 一、new建立類物件與不new區別 下面是自
【C++】C++用new和不用new建立類物件區別
起初剛學C++時,很不習慣用new,後來看老外的程式,發現幾乎都是使用new,想一想區別也不是太大,但是在大一點的專案設計中,有時候不使用new的確會帶來很多問題。 當然這都是跟new的用法有關的。new建立類物件,使用完後需使用delete刪除,跟申請記憶體類似。所以
在spring 中如果使用new建立一個物件時 這個物件將不在受spring管理器管理
文章如標題具體如下 比如現在有一個service 層 package com.zyc.service.impl; import javax.annotation.Resource; import org.springframework.stereotype.Servi