測試驗證在類構造和析構中丟擲異常, 是否會呼叫該類析構.
如果在乙個類成員函式中拋異常, 可以進入該類的析構函式.
/// @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 表示式 ...