2

したがって、この単純なシナリオを考えると、

class A{
public:        
    A(){
        n = new int(10);
    }
    ~A(){
        delete n;
    }
    int* n;
};

int main(){
    A* a = new A();
}

新しい割り当てを行っているときにa-pointerの割り当てが完了していないため、これによりヒープの破損(一般的な問題)が発生する可能性がありますか?

もしそうなら、ヒープコンストラクター内でstd :: vectorを使用することも禁止されていますよね?

ありがとうございました。

4

3 に答える 3

2

「ヒープコンストラクター」のようなものはありませんnew。また、ヒープ上のオブジェクトのコンストラクター内のメモリを使用してヒープを破損することはできません。のメモリは、呼び出さnew Aれた時点で完全に割り当てられています。A::A()あなたがしていることは正しく、非常に一般的です。コンストラクターは、構築中のオブジェクトがスタックに割り当てられているのかヒープに割り当てられているのかを気にする必要はありません。そうでなければ、ポインタとクラスはかなり役に立たないでしょう。

于 2013-01-23T02:10:24.513 に答える
2

「new」が例外をスローした場合、オブジェクトは割り当てられません(「new」の前に行われた割り当ては、割り当てを解除する必要があります。そうしないと、メモリが浸出することに注意してください)。

コンストラクタはエラーコードを返すことができないため、例外はエラーシステムとして使用されると考えられます。

myclass::myclass()
{
    param1 = new type1(); //successfull
    try
    {
        param2= new type2(); //may fail
    }
    (...)
    {
        delete param1; //need to deallocate
    }
}

これは少しやり過ぎです。コンストラクターに例外がまったくないことを好みます。例外をスローできるよりも、コンストラクターを使用してフレームオーク全体を作成する人もいます。

とにかく、アロケータの他のバグは以下を引き起こす可能性があります:

セグメンテーション違反(範囲外の値へのアクセス)

ヒープの破損(メモリ範囲内にあるが、オブジェクトによって技術的に所有されていないデータを上書きする)

無限ループ(プログラムを外部で中止する必要があります。そうしないと、アロケータを終了しません)。

もちろん、これらは通常のコードでも発生する可能性のある主要な問題です。ただし、デフォルトのアロケータは問題を引き起こさず、少なくとも「メモリ不足」の例外をスローする可能性があります。十分なRAMがない場合。

于 2013-01-23T02:14:13.377 に答える
2

aポインタの割り当てが終了しました。

新作は次のようになります(過度に単純化されています)

  • 割り当てる
  • 構築する

だからあなたの場合

  • Aを割り当てます
  • コンストラクトA
    • intを割り当てます
    • intの構築-初期化
  • コンストラクトAを完成させる

これは、例外を含むケースを無視します。

于 2013-01-23T02:15:51.473 に答える