删除 c++ 中指针数组的每个元素所指向的相应元素
Deleting corresponding element pointed to by each element of an array of pointer in c++
考虑我有一个指针数组声明为:
MyObject** myArr = new MyObject*[someSize] ;
然后我分配一些对象
myArr[i] = myObjectInstance
现在,我想删除此数组的每个指针指向的每个元素。那么正确的方法是什么呢? 我认为delete[] myArr
行不通。
首先删除每个对象,然后删除整个数组:
for(int i = 0; i < someSize; i++)
{
delete myArr[i];
}
delete[] myArr;
您可以使用标准算法std::for_each
和函数对象std::default_delete
。
这是一个演示程序
#include <iostream>
#include <memory>
#include <algorithm>
struct A
{
static size_t i;
A() { i++; }
~A() { std::cout << --i << ": ~A()n"; }
};
size_t A::i = 0;
int main()
{
const size_t N = 10;
A **p = new A *[N];
for ( size_t i = 0; i < N; i++ )
{
p[i] = new A();
}
std::for_each( p, p + N, std::default_delete<A>() );
delete []p;
return 0;
}
它的输出是
9: ~A()
8: ~A()
7: ~A()
6: ~A()
5: ~A()
4: ~A()
3: ~A()
2: ~A()
1: ~A()
0: ~A()
如果要以相对于创建它们的顺序相反的顺序删除数组的元素,则可以编写
std::for_each( std::reverse_iterator<A **>( p + N ),
std::reverse_iterator<A **>( p ), std::default_delete<A>() );
for (int i = 0; i < someSize; ++i)
delete myArr[i];
这可以解决问题。无论您怎么做,您都必须访问每个元素并单独删除它,然后删除带有delete [] myArr;
的数组。
但是动态分配阵列可能是一件麻烦事。为了跟上SO的传统,如果你能够使用它,我将推荐std::vector
(或任何有意义的STL容器(。您仍然需要单独删除所有元素,但现在您不必担心数组本身。
正如您的问题的评论中所述,如果您使用指向每个元素的智能指针,则不必手动删除任何内容。
delete[] myArr
是正确的,因为myArr
是动态分配的对象。
如果您执行动态分配myObjectInstance
的任何myArr[i] = myObjectInstance
,则可能需要先释放一些myArr[i]
,例如:
myArr[i] = new MyObject;
如果出现以下情况,delete myArr[i];
将崩溃:
MyObject m;
myArr[i] = &m;
在动态分配所有仓位的情况下,您可以使用for
来释放内存:
for (int i = 0; i < someSize; ++i)
delete myArr[i];
让我们假设所有myObjectInstance
都是堆分配对象的指针(如果不是这样,请参阅 @JoãoPaulo 的答案(,并且不涉及自定义new
或delete
。
for (size_t idx = 0; idx < someSize; ++idx)
delete myArr[idx];
delete[] myArr;
潜在的陷阱是什么?
嗯,有很多。如果只初始化一些数组元素怎么办?另一个将处于不确定状态,删除它们会导致未定义的行为。
另外,如果多个数组元素指向同一个对象怎么办?然后,您尝试多次删除对象。这也会导致未定义的行为。
这并不意味着你不能使用这种幼稚的方法,它只是提醒你一些先决条件:
- 确保数组的每个元素都初始化为"指向某个堆分配对象的指针"或
nullptr
(删除nullptr
是安全的(。 - 确保不要删除一个对象两次。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 从控制台中删除最后打印的元素
- 擦除while循环中迭代的元素