在構造和析構中丟擲異常

2021-07-09 06:06:40 字數 3672 閱讀 8696

測試驗證在類構造和析構中丟擲異常, 是否會呼叫該類析構.

如果在乙個類成員函式中拋異常, 可以進入該類的析構函式.

/// @file classroomexamples.cpp

/// @brief ***x-***x課堂筆記的驗證**

/// 測試c++異常

/// 在構造和析構中丟擲異常

#include #include #include "myexception.h"

#include "testthrow.h"

using namespace std;

void clear_cin();

void fntest_terminate();

// typedef void (__cdecl *terminate_function)()

void my_terminate_function();

void test_try_catch();

/// 宣告介面異常

/// 在函式後面修飾 throw(x, y, z)

/// 說明該函式要丟擲哪種異常, 給呼叫者看的

/// 函式後面的throw修改, 說明本函式要丟擲什麼型別的異常

/// 但是m$並沒有在函式中校驗throw的型別是否和函式說明相同

/// throw可以修飾乙個函式中丟擲的多個異常

void fnontrycatch(char* pin) throw(cmyexception*, int);

/// throw() 表明, 該函式保證不丟擲任何異常

void fnontrycatch1(char* pin) throw();

int main(int argc, char** argv, char** envp)

void test_try_catch()

/// 用基類指標去捕獲異常

/// throw的是具體異常子類的指標

catch (imyexceptionbase* pe)

}catch(...)

}void fnontrycatch1(char* pin)

}void fnontrycatch(char* pin)

*pin = 't';

}void fntest_terminate()

void my_terminate_function()

void clear_cin()

// myexception.cpp: implementation of the cmyexception class.

////

#include "myexception.h"

//// construction/destruction

//cmyexception::cmyexception(const char* pcerrmsg)

:m_pcerrmsg(pcerrmsg)

cmyexception::~cmyexception()

const char* cmyexception::geterrmsg()

// myexception.h: inte***ce for the cmyexception class.

////

#if !defined(afx_myexception_h__96603384_db81_48ce_8173_29bc2a82f26a__included_)

#define afx_myexception_h__96603384_db81_48ce_8173_29bc2a82f26a__included_

#if _msc_ver > 1000

#pragma once

#endif // _msc_ver > 1000

#include "myexceptionbase.h"

class cmyexception : public imyexceptionbase

;#endif // !defined(afx_myexception_h__96603384_db81_48ce_8173_29bc2a82f26a__included_)

// myexceptionbase.cpp: implementation of the cmyexceptionbase class.

////

#include "myexceptionbase.h"

//// construction/destruction

//imyexceptionbase::imyexceptionbase()

imyexceptionbase::~imyexceptionbase()

// myexceptionbase.h: inte***ce for the cmyexceptionbase class.

////

#if !defined(afx_myexceptionbase_h__90da9dc6_7686_417f_801b_2dc4f1e7a3c5__included_)

#define afx_myexceptionbase_h__90da9dc6_7686_417f_801b_2dc4f1e7a3c5__included_

#if _msc_ver > 1000

#pragma once

#endif // _msc_ver > 1000

class imyexceptionbase

;#endif // !defined(afx_myexceptionbase_h__90da9dc6_7686_417f_801b_2dc4f1e7a3c5__included_)

// testthrow.cpp: implementation of the ctestthrow class.

////

#include #include using namespace std;

#include "testthrow.h"

#include "myexception.h"

//// construction/destruction

//ctestthrow::ctestthrow()

ctestthrow::~ctestthrow()

// testthrow.h: inte***ce for the ctestthrow class.

////

#if !defined(afx_testthrow_h__573ed8ba_b817_440c_9d67_14cbca9ea6fc__included_)

#define afx_testthrow_h__573ed8ba_b817_440c_9d67_14cbca9ea6fc__included_

#if _msc_ver > 1000

#pragma once

#endif // _msc_ver > 1000

class ctestthrow

;#endif // !defined(afx_testthrow_h__573ed8ba_b817_440c_9d67_14cbca9ea6fc__included_)

建構函式和析構函式中丟擲異常

不會造成記憶體洩漏 1 new乙個物件有兩個過程 a.向系統申請記憶體空間 b.在申請的記憶體空間上執行建構函式,初始化物件。2 內部物件構造先於物件本身。3 物件在建構函式丟擲異常後,系統會負責清理構造物件時申請的記憶體,但不會呼叫物件析構函式。也就是說構造物件的記憶體會被釋放掉,已經完成例項化的...

C 中建構函式和析構函式丟擲異常問題

一.丟擲異常 1.1 丟擲異常 也稱為拋棄異常 即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異常。該語句的格式為 throw 表示式 如果在try語句塊的程式段中 包括在其中呼叫的函式 發現了異常,且拋棄了該異常,則這個異常就可以被try語句塊後的某個catc...

析構函式丟擲異常

看了下effective c 關於析構函式丟擲異常的一些描述。然後自己網上查了下。發現一篇說的不錯的。轉了。具體出處不知道是 1.丟擲異常 1.1 丟擲異常 也稱為拋棄異常 即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異常。該語句的格式為 throw 表示式 ...