2016-03-28 44 views
0

で新しいを使用して作成は、ポインタpを使用して作成:配列から要素のセットを削除すると、私は配列から最後の2つの要素を削除しようとしているC++

double *p = new double[5]; 
for(int i=0;i<5;i++) 
    cin>>*(p+i); 
ここまで正常に動作し

、とき私は、ポインタpを相殺し、それをコンパイルしますが、その後クラッシュします、次のよう

delete [] (p+3) 

に削除使用して配列の最後の2つの要素を削除してみてください。

これは許されますか?はいの場合はどこが間違っていますか?

おかげでこのステートメントで

+0

使用のstd ::ベクトルの

。 –

+0

最初に割り当てられたメモリから個々の位置を削除することはできません。 –

+1

"これは許可されていますか?"いいえ –

答えて

3

double *p = new double[5]; 

メモリの割り当てられた1つのエクステントがあります。その一部を削除することはできません。

問題を解決するには、古い配列の新しい配列コピー要素を新しい配列に割り当て、古い配列を削除する必要があります。例えば

double *q = new double[3]; 

std::copy(p, p + 3, q); 

delete [] p; 

p = q; 

について

アレイのサイズは、標準コンテナstd::vector<double>を使用することをお勧めし変更することができる場合。例

std::vector<double> v(5); 

for (std::vector<double>::size_type i = 0; i < v.size(); i++) 
{ 
    std::cin >> v[i]; 
} 

//... 

v.erase(std::next(v.begin(), 3), v.end()); 

それとも

v.erase(std::prev(v.end(), 2), v.end()); 
関連する問題