C++ 从使用c+;中的new创建的数组中删除一组元素+;
我试图从使用指针p创建的数组中删除最后两个元素,如下所示:C++ 从使用c+;中的new创建的数组中删除一组元素+;,c++,pointers,C++,Pointers,我试图从使用指针p创建的数组中删除最后两个元素,如下所示: double *p = new double[5]; for(int i=0;i<5;i++) cin>>*(p+i); 它将编译,但随后崩溃 这是允许的吗?如果是的话,那么我错在哪里 在此声明中,谢谢 double *p = new double[5]; 分配了一段内存。您不能删除其中的一部分 要解决此问题,需要分配一个新数组,将旧数组的元素复制到新数组中,然后删除旧数组 比如说 double *q =
double *p = new double[5];
for(int i=0;i<5;i++)
cin>>*(p+i);
它将编译,但随后崩溃
这是允许的吗?如果是的话,那么我错在哪里
在此声明中,谢谢
double *p = new double[5];
分配了一段内存。您不能删除其中的一部分
要解决此问题,需要分配一个新数组,将旧数组的元素复制到新数组中,然后删除旧数组
比如说
double *q = new double[3];
std::copy( p, p + 3, q );
delete [] p;
p = q;
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() );
如果可以更改数组的大小,最好使用标准容器std::vector
比如说
double *q = new double[3];
std::copy( p, p + 3, q );
delete [] p;
p = q;
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() );
在这份声明中
double *p = new double[5];
分配了一段内存。您不能删除其中的一部分
要解决此问题,需要分配一个新数组,将旧数组的元素复制到新数组中,然后删除旧数组
比如说
double *q = new double[3];
std::copy( p, p + 3, q );
delete [] p;
p = q;
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() );
如果可以更改数组的大小,最好使用标准容器std::vector
比如说
double *q = new double[3];
std::copy( p, p + 3, q );
delete [] p;
p = q;
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() );
您不能从最初分配的内存中删除单个位置。“允许这样做吗?”否。规则很简单-
new/new[]
返回的值必须与delete/delete[]
使用的值相同。由于您给delete[]
的值未分配给new[]
,因此行为未定义。该值是分配给p
的任何new[]
——它不是p+3
。您不能从最初分配的内存中删除单个位置。“允许这样做吗?”不。规则很简单,new/new[]
返回的值必须与delete/delete[]
使用的值相同。由于您给delete[]
的值未分配给new[]
,因此行为未定义。该值是分配给p
的任何new[]
——它不是p+3
。