拷貝建構函式執行後解構函式呼叫兩次出錯問題
問題說明:
Oblong(const Oblong &t) //copy建構函式
{
p_width = new int[2];
p_height = new int[2];
this->p_width = t.p_width; //指標地址的複製(錯誤的方式!)
*(this->p_height) = *t.p_height; //指標指向的內容的複製(正確的方式!)
}
剛開始學習C++,遇到的問題也許比較簡單,但解決了就是自己的。
昨晚一個晚上就是用了那錯誤的方式,編譯都沒錯,就程式最後執行解構函式釋放記憶體的時候出錯了。今天總算弄清楚了原因,如果用第一種錯誤的方式,會使得兩個指標指向同一個物件,當解構函式釋放一次記憶體時,就會留下一個野指標,因此析構第二次時就會出錯。
而第二種傳內容的方式使得兩個指標指向不同的地方,所以釋放記憶體就不會出錯。
對指標的操作一定要慎重,要考慮好是否會產生空指標情況。 60週年了!!!國家生日快樂哈哈!
相關推薦
拷貝建構函式執行後解構函式呼叫兩次出錯問題
#ifndef FILENAME #define FILENAME int k=10; class Oblong { public: void out_area() const; //宣告計算面積函式 Oblong()
1、【C++】類&物件/建構函式/拷貝建構函式/操作符過載/解構函式
一、C++類 & 物件 C++ 在 C 語言的基礎上增加了面向物件程式設計,C++ 支援面向物件程式設計。類是 C++ 的核心特性,通常被稱為使用者定義的型別。 類用於指定物件的形式,它包含了資料表示法和用於處理資料的方法。類中的資料和方法稱為類的成員。函式在
5.3-day03-C++建構函式/this指標/解構函式
四、 5.建構函式 class 類名 { ... 類名 (形參表) { 建構函式體; } }; 當一個物件被建立時,建構函式會自動被執
為什麼建構函式不能為虛擬函式,而解構函式可以為虛擬函式?
1. 為什麼建構函式不能為虛擬函式? 虛擬函式的呼叫需要虛擬函式表指標,而該指標存放在物件的內容空間中;若建構函式宣告為虛擬函式,那麼由於物件還未建立,還沒有記憶體空間,更沒有虛擬函式表地址用來呼叫虛擬函式——構造函數了。 2. 為什麼解構函式可以為虛擬函式,如果不
C++學習之多型篇(虛擬函式和虛解構函式的實現原理--虛擬函式表)
通過下面的程式碼來說明: #include <iostream> #include <stdlib.h> #include <string> using namespace std; /** * 定義動物類:Animal * 成員
為什麼必須實現虛解構函式 ,純虛解構函式的原因
本文的主要參考書籍是 C++ Primer struct A { virtual ~A() = 0; }; struct B : A { virual ~B() {} }; int main( void ) { B x; } 編譯的時候
將解構函式設定為虛擬函式,並且解構函式可以為純虛擬函式
為什麼基類的解構函式是虛擬函式? 在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。 但如果不需要基類對派生類及物件進行操作,則不能定義虛擬函式,因為這樣會增加記憶體開銷.當類裡面有定義虛擬函式的時候,編譯器會給類新增一個虛擬函式表,裡面
深入探索C++物件模型(九) 解構函式 (以及顯式定義的解構函式問題、解構函式Rules of Three)
如果類沒有定義解構函式,那麼只有類中含有成員物件(或者本類的基類)擁有解構函式的情況下,編譯器才會合成一個出來,否則解構函式被視為不要,也就不需要合成。例如,如下類,雖然Point類擁有虛擬函式:class Point { piblic: Point(flo
fork函式_例項(3)呼叫兩次以避免僵死程序
--------參考文獻 W.Richard Stevens, Stephen A.Rago.UNIX環境高階程式設計[M].北京:人民郵電出版社,2014.6:189-190. 一、 相關概念 1.1 僵死程序 一個已經終止,但是其父程序尚未對其進行善後處理
廣義表的C++實現(包含建構函式,拷貝建構函式,解構函式,獲取表頭,表尾,獲取直接後繼等操作)
資料結構是資料在系統中的物理儲存結構,自己編寫資料結構可以對某種資料結構的物理和邏輯結構有更深的瞭解。 一、廣義表作為一種資料結構有以下的特點: 1. 廣義表是遞迴的; 2. 廣義表的元素可以使廣義表,也可以是值; 3. 廣義表是有序的; 4. 廣義表是有長度有深度的。 二
建構函式,拷貝建構函式,解構函式,賦值函式
例一: class CGoods { //行為,成員方法 public: CGoods(char *name = NULL, int amount = 0, double price = 0.0) //建構函式 &nbs
類的建構函式、解構函式、拷貝建構函式、賦值函式
類的四種基本預設函式:建構函式、解構函式、拷貝建構函式、賦值函式。 建構函式:建立類時,系統自動呼叫建構函式,用以初始化,分配空間,沒有自定義的建構函式時,系統預設一個無引數的建構函式。 class book { private: int isBook;
C++類中的一些細節(過載、重寫、覆蓋、隱藏,建構函式、解構函式、拷貝建構函式、賦值函式在繼承時的一些問題)
1 函式的過載、重寫(重定義)、函式覆蓋及隱藏 其實函式過載與函式重寫、函式覆蓋和函式隱藏不是一個層面上的概念。前者是同一個類內,或者同一個函式作用域內,同名不同引數列表的函式之間的關係。而後三者是基類和派生類函式不同情況下的關係。 1.1 函式過載
C++在單繼承、多繼承、虛繼承時,建構函式、複製建構函式、賦值操作符、解構函式的執行順序和執行內容
一、本文目的與說明 1. 本文目的:理清在各種繼承時,建構函式、複製建構函式、賦值操作符、解構函式的執行順序和執行內容。 2. 說明:雖然複製建構函式屬於建構函式的一種,有共同的地方,但是也具有一定的特殊性,所以在總結它的性質時將它單獨列出來了。
編寫類String的建構函式、拷貝建構函式、解構函式和賦值函式
class String { public: String(const char *str = NULL); // 普通建構函式 String(const String &other); // 拷貝建構函式 ~String(void);
編寫類String 的建構函式、拷貝建構函式、解構函式和賦值函式
編寫類String 的建構函式、解構函式和賦值函式,已知類String 的原型為: class String { public:String(const char *str = NULL); // 普通建構函式String(const String &other
總結c++類的建構函式 拷貝建構函式 解構函式 賦值運算子過載的特點以及函式呼叫順序
對 c++類的建構函式 拷貝建構函式 解構函式 賦值運算子過載 相關知識的總結,並附上例子,希望對大家有幫助,有錯誤大家可以指出來 一 建構函式 1 建構函式: 建構函式時一個特殊的成員函式,用來初始化物件的資料成員,在物件建立時,由編譯器自動呼叫,在物件的生命週期
建構函式 解構函式 拷貝建構函式
一、建構函式 為了更好的說明建構函式,首先建立一個簡單的日期類 Date.cpp class Date { public: void DatePrint(); void DateSet(int year, int month, int day); private:
NDK_CPP語言-建構函式+解構函式+拷貝函式
public class NDKCppInterface { //1.C++中建構函式 public native void executeCppCustruct(); //2.C++中解構函式 public native void ex
C++中建構函式,拷貝建構函式,解構函式
C++中預設建構函式就是沒有形參的建構函式。準確的說法,按照《C++ Primer》中定義:只要定義一個物件時沒有提供初始化式,就是用預設建構函式。為所有 的形參提供預設實參的建構函式也定義了預設建構函式。 合成的預設建構函式,即編譯器自動生成的預設建構函式。《C++ Pr