使用动态指针数组进行动态对象分配 - 使用什么删除?

Dynamic object allocation using array of dynamic pointers - what delete to use?

本文关键字:动态 什么 分配 删除 指针 数组 对象      更新时间:2023-10-16

有人能帮我理解这些例子吗?

我认为下面的代码会生成一个包含 10 个使用自动内存分配的指针的数组。由于我们对对象使用动态内存分配,因此当数组超出范围时,指向数组中对象的指针将丢失,但对象仍保留在内存中,直到调用删除。

MyClass* c[10];
c[0] = new MyClass();

我想下面的示例生成使用动态内存分配的十个对象的数组。我们必须使用 delete[] 来删除数组和对象。

MyClass* d = new MyClass[10];

我想在下面的示例中,我们将分配一个包含 50 个指针的数组来反对。我们必须在这里调用 delete[] 或 delete 或两者兼而有之吗?

MyClass** b = new MyClass*[50];
b[0] = new MyClass();

我知道我可以使用更好的东西来管理内存分配,但我被迫使用 new 和 delete。有人可以检查我的理解是否正确并解释我在第三个示例中必须使用哪些删除吗?

谢谢。

我认为以下代码会生成一个包含 10 个指针的数组,这些指针是 使用自动内存分配。由于我们使用动态内存 对象的分配,指向数组中对象的指针在以下情况下丢失 数组超出范围,但对象保留在内存中,直到删除 被称为。

MyClass* c[10];
c[0] = new MyClass();

正确。当阵列超出范围时,分配的MyClass实例将保持活动状态,但您错过了在进程结束之前释放内存的机会(在这种情况下,操作系统将释放内存)。

我想下面的示例生成了十个对象的数组,这些对象是 使用动态内存分配。我们必须使用 delete[] 来删除 数组和对象。

MyClass* d = new MyClass[10];

正确。

我想在下面的示例中,我们将分配一个 50 的数组 指向对象的指针。我们是否必须调用 delete[] 或删除或两者兼而有之 这里?

MyClass** b = new MyClass*[50];
b[0] = new MyClass();

第一个语句正确,则分配一个包含 50 个指向MyClass的指针的数组。然后分配MyClass的单个实例,并将其地址分配给该数组的第一个元素。

您必须先为数组的每个单独分配的元素调用delete。之后,您必须在动态分配的数组上调用 delete:

delete b[0];
delete[] b;

deletedelete[]是早期C++广泛使用的东西,但现在几乎被STL容器类所淘汰。

基本思想是new堆上创建一个类的新实例,同时delete销毁它。但是,如果使用new[]创建对象数组,则需要调用delete[]来帮助编译器。

但是,您也可以有一个指针数组。指针本身就是一个对象。所以,如果你有一个分配了new[]的指针数组,然后每个元素都分配了new,你必须使用纯delete逐个删除数组的内容,然后使用delete[]删除数组本身。

幸运的是,现在我们使用std::vector来存储对象数组。vector类型为您处理所有分配和删除,因此您只需等待其生存期结束,然后为您删除对象。

相关文章: