11
#include <iostream>
using namespace std;
class base
{
   int a;
 public: 
   base() {a =0;}
 };
 class derv :public base
 {
   int b;
  public:
   derv() {b =1;}
 };
 int main()
 {
    base *pb = new derv();
    delete pb;
 }

derv クラスに仮想デストラクタがありません。derv オブジェクトの基本部分だけを削除しますか??

4

3 に答える 3

21

かもしれない。

baseには仮想デストラクタがないため、コードは未定義の動作を示します。何かが起こるかもしれません。期待どおりに動作するように見えるかもしれません。メモリ リークが発生する可能性があります。プログラムがクラッシュする可能性があります。ハードドライブをフォーマットする可能性があります。

引用が要求されました。C++11 §5.3.5/3 は、スカラーdelete式 (つまり、delete[]式ではない) について次のように述べています。

削除するオブジェクトの静的型がその動的型と異なる場合、静的型は削除するオブジェクトの動的型の基本クラスであり、静的型は仮想デストラクタを持つ必要があります。そうしないと、動作が未定義になります。

静的型 ( base) は動的型 ( ) とは異なりderv、静的型には仮想デストラクタがないため、動作は未定義です。

于 2012-01-06T01:00:38.737 に答える
0

ソース コードには、動的に作成されるメンバー変数がないため、メモリ リークはありません。

ケース 1 の下の変更例を考えてみましょう。

#include <iostream>
using namespace std;
class base
{
   int a;
 public: 
   base() {a =0;}
   ~base() 
     {
       cout<<"\nBase Destructor called";

     }
 };
 class derv :public base
 {
   int *b;

  public:
   derv() { b = new int;}
  ~derv()
  {
      cout<<"\nDerv Destructor called"; 
      delete b;
  }
 };
 int main()
 {
    base *pb = new derv();
    delete pb;
 }

この場合、出力は次のようになります。

   Base Destructor called

この場合、'delete' キーワードを使用して削除する必要がある 'new' を使用して 'b' が動的に作成されるため、メモリ リークが発生します。derv デストラクタが呼び出されていないため、削除されていないため、メモリ リークが発生しています。

以下のケース 2 を検討してください。

#include <iostream>
using namespace std;
class base
{
   int a;
 public: 
   base() {a =0;}
   virtual ~base() 
     {
       cout<<"\nBase Destructor called";

     }
 };
 class derv :public base
 {
   int *b;

  public:
   derv() { b = new int;}
  ~derv()
  {
      cout<<"\nDerv Destructor called"; 
      delete b;
  }
 };
 int main()
 {
    base *pb = new derv();
    delete pb;
 }

2出力になる場合は、

Derv Destructor called 
Base Destructor called

この場合、derv デストラクタが呼び出され、b が削除されるため、メモリ リークは発生しません。

デストラクタは、基本クラスで Virtual として定義して、派生クラス オブジェクトを指している基本クラス ポインタを削除するときに、派生クラス デストラクタが確実に呼び出されるようにすることができます。

「派生クラスが動的にメンバーを作成した場合、デストラクタは仮想でなければならない」と言えます。

于 2012-01-06T12:37:08.220 に答える
-1

コードにメモリ リークはありません。派生クラスのデストラクタで一部のメモリを解放する必要がある場合、メモリ リークが発生していました。

于 2012-01-06T01:06:26.067 に答える