我正在尝试从使用指针p创建的数组中删除最后两个元素,如下所示:
double *p = new double[5];
for(int i=0;i<5;i++)
cin>>*(p+i);
直到这里工作正常,当我尝试通过偏移指针p然后使用delete以下列方式删除数组中的最后两个元素时
delete [] (p+3)
它会编译但随后崩溃。
是否允许,如果是,那么我哪里出错?
谢谢
答案 0 :(得分:3)
在本声明中
double *p = new double[5];
分配了一个内存范围。你不能删除它的一部分。
要解决此问题,您需要将旧数组的新数组复制元素分配到新数组中,然后删除旧数组。
例如
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() );