2

私の大規模なプロジェクトの 1 つで、サイズを指定せずに初期化された配列を削除する際に問題が発生しました。
何が問題なのかを確認する簡単なプログラムを作成しました。コードは次のとおりです

#include "stdafx.h"

class Checker
{
public:
    Checker()
    :myI(i++){}

virtual ~Checker(){
    printf("%i " , myI);
    fflush(stdout);
}
private:
    int myI;
    static int i;
};

int Checker::i = 0;


int _tmain(int argc, _TCHAR* argv[]){
    Checker* somePointer;
    Checker* anotherPointer;

    somePointer = new Checker[4]{
        Checker(), Checker(), Checker(), Checker()};

    anotherPointer = new Checker[]{
        Checker(), Checker(), Checker(), Checker()};

    delete[] somePointer;

    delete[] anotherPointer; //approach A
    delete anotherPointer; //approach B
    //in approach C anotherPointer is not deleted

    return 0;
}

ご覧のとおり、anotherPointer は明示的に定義されたサイズなしで初期化されます。
もちろん、アプローチとしてマークされたラインのうち、一度にアクティブになるのは 1 つだけです。
アプローチAの出力は次のようになります(< crash>は、プログラムが予期せず終了することを意味します)

 3 2 1 0 <crash> 

アプローチBの出力は

 3 2 1 0 4 <crash> 

アプローチ C では、出力が 3 2 1 0 である場合もあれば、何も出力せずにアプリケーションがクラッシュする場合もあります。

私の知る限り、配列のサイズを指定せずに初期化すると、異なるメモリ割り当てで終了しますが、最後にクラッシュするアプリケーションの問題を解決する方法がわかりません。これが私の質問です。

Visual Studio Pro 2013 Update 4 (MSVC++) を使用しています

EDIT
サイズを明示的に指定する以外にその問題の解決策がない場合、私の質問は
なぜその「機能」がMSCC ++に実装されているのですか?

4

1 に答える 1

2

現在、C++ 標準では、サイズを明示的に指定せずに配列を割り当てることはできません (Java や C# でできるように)。コードをコンパイルしようとすると、GCC C++ と Clang の両方でエラーが発生します (C++14 モードでも)。Visual Studio 2015 RC も生成しerror C3078: you cannot 'new' an array of unknown boundsます。要約すると、これは機能ではなく、VS 2015 で明らかに修正された VS 2013 のバグです。

于 2015-05-12T14:49:35.593 に答える