【发布时间】:2019-12-18 04:13:30
【问题描述】:
我很困惑。代码末尾一定要delete s[]吗?
将派生类对象分配给基类类型的数组(固定大小)的正确方法是什么?
int main () {
Shape *s[2];
s[0] = new Circle(...);
s[1] = new Rectangle(...);
// etc
delete s[] // Do you have to delete ?
}
【问题讨论】:
-
delete s[]不是有效的语法。它不会编译。所以当然你不应该把它添加到你的代码中。 -
这段代码中有两次
new的调用,所以应该有两次delete的调用。由于您在s[0]和s[1]中存储了指向已分配内存的指针,因此您应该删除s[0]和s[1],如delete s[0]; delete s[1];。或者类似for (int i = 0; i < 2; ++i) delete s[i];更好的是,使用智能指针(例如std::unique_ptr)代替原始指针,并可能使用标准容器(例如std::vector)代替数组。 -
@IgorTandetnik 谢谢。因此,如果有
Shape *s[10]但只有 s[0] 和 s[1],当使用 for 循环删除时,我是否会循环直到 10 喜欢。for (int i = 0; i < 10; ++i) delete s[i];
标签: arrays c++11 pointers polymorphism delete-operator