Arrays C+中的数组多态性+;11

Arrays C+中的数组多态性+;11,arrays,c++11,pointers,polymorphism,delete-operator,Arrays,C++11,Pointers,Polymorphism,Delete Operator,我很困惑。您是否必须在代码末尾执行删除s[] 将派生类对象指定给基类类型的数组(固定大小)的正确方法是什么 int main () { Shape *s[2]; s[0] = new Circle(...); s[1] = new Rectangle(...); // etc delete s[] // Do you have to delete ? } 通常需要手动删除,但如果它位于int main中,则不需要手动删除,因为操作系统将在程序完成后自

我很困惑。您是否必须在代码末尾执行
删除s[]

将派生类对象指定给基类类型的数组(固定大小)的正确方法是什么

int main () {

    Shape *s[2];
    s[0] = new Circle(...);
    s[1] = new Rectangle(...);
    // etc

    delete s[] // Do you have to delete ?
}

通常需要手动删除,但如果它位于
int main
中,则不需要手动删除,因为操作系统将在程序完成后自动释放您分配的所有内存

但是,只有使用
newshape[n]
语法分配内存时,才会出现这种情况。使用您的语法,您不需要释放数组


delete[]
不会释放底层指针,只会释放指针数组。您还需要循环并手动删除内容。

行为取决于实际内存的分配位置。如果在堆栈上分配数组,则不应释放数组本身的内存,但仍必须遍历所有指针以释放内存:

    Shape* s[2];
    s[0] = new Circle;
    s[1] = new Rectangle;
    for (int i = 0; i < 2; ++i)
    {
        delete s[i];
    }
Shape*s[2];
s[0]=新的圆;
s[1]=新矩形;
对于(int i=0;i<2;++i)
{
删除s[i];
}
或者,如果出于某些原因确实希望在堆中分配内存,您可以在堆上创建一个指针数组,因此不要忘记释放数组本身的内存:

    Shape **s = new Shape*[2];
    s[0] = new Circle;
    s[1] = new Rectangle;
    for (int i = 0; i < 2; ++i)
    {
        delete s[i];
    }
    delete[] s;
Shape**s=新形状*[2];
s[0]=新的圆;
s[1]=新矩形;
对于(int i=0;i<2;++i)
{
删除s[i];
}
删除[]s;

删除s[]
不是有效的语法。它不会编译。因此,您当然不应该将其添加到代码中。此代码中有两次调用
new
,因此应该有两次调用
delete
。由于您将指向已分配内存的指针存储在
s[0]
s[1]
中,因此应删除
s[0]
s[1]
,如
删除s[0];删除[1]。或者类似于(inti=0;i<2;++i)删除s[i]更好的方法是使用智能指针(例如
std::unique_ptr
)代替原始指针,并可能使用标准容器(例如
std::vector
)代替数组。可能重复@IgorTandetnik谢谢。因此,如果有
Shape*s[10]
但只有s[0]和s[1],那么在删除using for循环时,我会循环到10,就像这样<代码>用于(int i=0;i<10;++i)删除s[i]在我看来,这是一个危险的习惯:在使用
new
创建的任何对象上不调用
delete
,意味着该对象的析构函数将不会被调用,请参见,例如。