2017-03-16 7 views
-1

これは私が書いた簡単なプログラムです:削除原因予期せぬクラッシュ

using namespace std; 

int main() { 

    string *word = new string[1]; //create a string object 

    *word = "blablabla"; //assign a string to that object 

    cout << "String: " << *word << endl; 

    delete word; //delete object? Causes unexected crash 

    int *ar = new int [10]; //create array of 10 blocks 

    ar[3] = 4; //assign a value to bl-3 

    cout << ar[3] << endl; 

    delete ar; //delete object, works 

    return 0; 
} 

を今、私はこれまで理解して何から、1が(new[]new(私が作成し、削除一つのオブジェクトのように)とdelete[]deleteを使用しています削除してオブジェクトの配列を作成します)。問題は、以前のdeleteが私のプログラムをクラッシュさせ、後者は正常に動作するということです。ただし、delete[] wordの作業は行われます。

オブジェクトの配列はどのように作成していますか? string *word = new string[1]がただ1つのオブジェクトを作成すると誤解していますか?

+2

あなたはこの '削除[] word'のような配列を削除します。 –

+0

作成するオブジェクトの数は関係ありません。あなたが 'new []'を使うなら、あなたは 'delete []'を使わなければなりません。 – NathanOliver

+0

ポインタで遊んでいないのであれば、代わりに 'std :: vector'を使うことをお勧めします。 –

答えて

1

どのようにオブジェクトの配列を作成していますか? string *word = new string[1]がただ1つのオブジェクトを作成すると誤解していますか?

1つのオブジェクトの配列を作成しています。

1つのオブジェクトを作成しています。それは本当だ。あなたはまだ配列を作成しています。

したがって、delete []フォームを使用する必要があります。

delete [] word; 

delete [] ar; 
+0

'delete ar'も間違っていますか? –

+0

@HichigayaHachiman、それは正しい理解です。 'delete [] ar;'を使う必要があります。 –

関連する問題