C++ 从使用c+;中的new创建的数组中删除一组元素+;

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 =

我试图从使用指针p创建的数组中删除最后两个元素,如下所示:

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