【发布时间】:2016-02-25 06:04:59
【问题描述】:
在下面的代码中,我使用 new 关键字动态分配数组。在超出范围之前,我在数组上调用 delete[],然后将下注设置为 null。
我的问题是,如果这足够了,delete[] 会确保为我的数组中的所有 3 个 Car 对象分配的内存都已释放。还是我必须做一些特定的事情来释放每个对象使用的内存?
void main()
{
Car * myArray = new Car[]{ * new Car("BMW"),*new Car("AUDI"), * new Car("SKODA") };
delete[] myArray;
myArray = nullptr;
}
另外,汽车类看起来像这样。在这里将名称设置为空是否也足够了。名称是一个字符指针。或者可能不需要将指针设置为 null,因为它没有引用堆上的任何内容。
Car::Car(char * newName)
{
name = newName;
}
Car::~Car()
{
name = nullptr;
}
编辑:
首先,感谢所有出色的答案和 cmets。我从阅读中学到了很多东西。
现在我明白了,我需要在声明一个动态分配的数组时指定一个大小。
除此之外,我也明白,我需要像我一样停止使用 new。我想最好将对象扔到堆栈上,并在某个时候让它们超出范围。除此之外,我猜我的汽车上的析构函数什么也没做。
阅读 cmets 和答案后,我将代码更改为:
int main()
{
Car * myArray = new Car[3]{ Car("BMW"), Car("AUDI"), Car("SKODA") };
delete[] myArray;
myArray = nullptr;
}
【问题讨论】:
-
你使用
new太多了。几乎没有理由这样做* new Car("BMW")。 -
不要。说真的,只是不要。现在,忘记你甚至听说过
new。你不需要它,你也不想要它。 new 表达式的数组形式特别糟糕——即使在将来你真的需要使用new,你也不应该使用数组new——永远。如果您想要一个动态数组,请使用std::vector。如果您需要一个动态指针数组(也不太可能),请查找 Boostptr_vector和/或使用vector<unique_ptr>。哦,main返回一个int。 -
你使用指针太多了。这是一个在堆/空闲存储上创建向量然后使用析构函数将其删除的示例:
-
在指针超出范围之前将其设置为 null 并没有任何用处。
标签: c++ arrays pointers dynamic-memory-allocation