0

new/deletemalloc/を使用して同じ効果を得たいため、コンストラクターの初期化リストを使用する必要のないクラスの例を作成しました (学習目的のみ) free。コンストラクターの初期化リストを使用しない以外の制約は何ですか? 次のコードは、新規作成/削除の動作を正しくシミュレートしていると思いますか?

#include <iostream>
using namespace std;

class X
{
private:
        int* a;
public:
        X(int x)
        {
             this->a = new int;
             *(this->a) = x;
        }
        ~X() { delete this->a; }
        int getA() { return *(this->a); }
};

class Y
{
private:
        int* a;
public:
        void CTor(int x)
        {
             this->a = new int;
             *(this->a) = x;
        }
        void DTor() { delete this->a; }
        int getA(){ return *(this->a); }
};

void main()
{
     X *xP = new X(44);
     cout<<xP->getA()<<endl;
     delete xP;

     Y *yP = static_cast<Y*>(malloc(sizeof(Y)));
     yP->CTor(44);
     cout<<yP->getA()<<endl;
     yP->DTor();
     free(yP);

     system("pause");
}

を使用しないdelete xPと、プログラムの終了時にデストラクタが自動的に呼び出されますが、フリー ストアは解放されません (つまりxP、 のフリー ストア、フィールドのフリー ストアはa解放されます)。デストラクタを使用するdelete xPと、呼び出された後、フリー ストアが完全に解放されます。私が間違っている場合は、私を修正してください。

4

2 に答える 2

1

あなたの質問に対する実際の答えは、あなたが間違っているということです。呼び出さないとdelete xPメモリリークが発生します。その後、OS がメモリをクリーンアップする可能性が非常に高くなりますが、これが発生することは C++ ランタイム ライブラリによって保証されていません。これは、OS が一般的に優れたサービスとして提供するものです [そして、非常に便利です。不完全なコードを書き、if (condition) { cout << "Oh horror, condition is true, I can't continue" << endl; exit(2); }恐ろしい問題が発生したときにすべてをクリーンアップすることを心配する必要のないコードを作成する].

ただし、私の主なポイントは、それ自体が破壊を必要とするメンバーを追加するとすぐに、この種のものは非常に面倒になるということです。

class X
{
  private:
    std::string str;
  ... 
};

のデストラクタを呼び出す簡単な方法はありませんstr。また、例外と自動クリーンアップを使用することにした場合は、さらに悪化します。

于 2013-10-21T21:39:53.810 に答える
1

とを区別する多くの微妙な違いがありnewます。クラスがPODタイプの場合にのみ同等だと思います。mallocdeletefree

2 つのタイプを自由に混在させることはできないことに注意してください。Anewは常に a によってバランスがとられている必要があり、 a によってバランスがとられていることはdeleteありませんfree。同様にmalloc、 によってのみバランスを取る必要がありますfree。2 つの結果を混在させると、未定義の動作が発生します。

于 2013-10-21T21:36:26.557 に答える