Cpp クラス 継承 アップキャスト 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(クラス 継承 アップキャスト)
(クラス 継承 アップキャスト)
462行: 462行:
  
  
 ちゃんとアップキャストされても、ちゃんと基底クラスのメンバ関数が派生クラスで動作した内容を反映して動いています。でもデストラクタは、呼ばれていないですね。残念なプログラムになっているようです。次の「継承 デストラクタ」の記事でこの問題について対応したいと思います。今のままでは動的に変数をクラス内で生成しているCDeriveArrInheritanceを使ったときにメモリリークが起こってしまいます。動的に確保したint型の配列メモリをプログラム終了後も解放しようとしない現象です。実際にはプログラム終了時にRAII((Resource Acquisition Is Initialization)という機能によって、ほとんどの場合メモリは解放されます。C++では、smart pointerというものに包み込まれた状態になり、動的に確保したメモリ領域を監視しているので、動的に確保されたメモリは適切に開放されます。たとえ途中で例外処理が発生してプログラムが落っこちた場合でも、解放されます。でも、ちゃんとやった方がいいです。上記のような状態は決してメモリリークがおきないとは保証されないので、ちゃんとやった方がいいのです。でも、アップキャストしたら元々のデストラクタが呼ばれないのは困ったものです。うっかりすると危険だわ。
+
 ちゃんとアップキャストされても、ちゃんと基底クラスのメンバ関数が派生クラスで動作した内容を反映して動いています。でもデストラクタは、呼ばれていないですね。残念なプログラムになっているようです。次の「継承 デストラクタ」の記事でこの問題について対応したいと思います。今のままでは動的に変数をクラス内で生成しているCDeriveArrInheritanceを使ったときにメモリリークが起こってしまいます。動的に確保したint型の配列メモリをプログラム終了後も解放しようとしない現象です。実際にはプログラム終了時にRAII(Resource Acquisition Is Initialization)という機能によって、ほとんどの場合メモリは解放されます。C++では、smart pointerというものに包み込まれた状態になり、動的に確保したメモリ領域を監視しているので、動的に確保されたメモリは適切に開放されます。たとえ途中で例外処理が発生してプログラムが落っこちた場合でも、解放されます。でも、ちゃんとやった方がいいです。上記のような状態は決してメモリリークがおきないとは保証されないので、ちゃんとやった方がいいのです。でも、アップキャストしたら元々のデストラクタが呼ばれないのは困ったものです。うっかりすると危険だわ。
  
 
[[C PlusPlus#C++からの技術|C++]]に戻る
 
[[C PlusPlus#C++からの技術|C++]]に戻る

2020年7月23日 (木) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス