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
,意味着该对象的析构函数将不会被调用,请参见,例如。