私の大規模なプロジェクトの 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 ++に実装されているのですか?