使用动态指针数组进行动态对象分配 - 使用什么删除?
Dynamic object allocation using array of dynamic pointers - what delete to use?
有人能帮我理解这些例子吗?
我认为下面的代码会生成一个包含 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;
delete
和delete[]
是早期C++广泛使用的东西,但现在几乎被STL容器类所淘汰。
基本思想是new
堆上创建一个类的新实例,同时delete
销毁它。但是,如果使用new[]
创建对象数组,则需要调用delete[]
来帮助编译器。
但是,您也可以有一个指针数组。指针本身就是一个对象。所以,如果你有一个分配了new[]
的指针数组,然后每个元素都分配了new
,你必须使用纯delete
逐个删除数组的内容,然后使用delete[]
删除数组本身。
幸运的是,现在我们使用std::vector
来存储对象数组。vector
类型为您处理所有分配和删除,因此您只需等待其生存期结束,然后为您删除对象。
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 指针类型类成员的动态强制转换的恒定性是什么?
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 删除类成员的动态分配内存的最佳方法是什么
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 在创建动态二维数组时,在A[i*c+j]中使用c有什么用,即c代表什么
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 为动态创建的数组使用静态关键字有什么意义吗?
- 动态数组和动态分配数组有什么区别?
- 按引用传递和动态内存分配之间的区别是什么
- 如果我在 Linux 上更改C++动态共享库,而我的可执行程序在其上使用,会发生什么
- 如果我不删除动态创建的变量会发生什么
- 从C 中的函数中动态分配的缓冲区返回的最佳模式是什么?
- 我的记忆动态规划算法有什么问题?
- 这种动态调整数组大小的尝试的输出有什么问题
- "Debug assertion failed" 这种有什么问题?它应该按年份对包含电影对象的动态列表进行排序
- 使用动态指针数组进行动态对象分配 - 使用什么删除?
- 阻止用户创建班级对象的副本,但允许动态的对象有什么好处
- 在调用解构之后,存储在内存中的动态分配值会发生什么变化
- 指针数组在动态分配时应指向什么