删除指针数组与删除指针向量
Deleting an array of pointers vs deleting a vector of pointers
当我们调用时
delete[] array; // array is a pointer to an array
或
delete[] vector; // vector is a pointer to a vector
假设这些是链表头指针的数组/向量:这两个语句是否调用其中每个项目的析构函数?或者我们应该遍历它们,删除每个项目,然后删除数组或向量本身?
让我更具体地说,如果数组持有一个头指针,并调用其析构函数,则会删除其下一个节点或指向的节点。
您的第二个代码片段不正确。 delete
和delete[]
是两个不同的运算符。 delete
用于删除由new
创建的实例,delete[]
用于删除由new[]
创建的元素数组。
在C++中,数组和向量并不关心它们存储的内容。对于数组和向量,您需要在删除数组和向量之前删除每个项目(如果使用 new
分配它们(。
如果像这样创建数组
Sample* arr[100];
for (int i = 0; i < 100; ++i) {
arr[i] = new Sample();
}
你需要像这样删除它们
for (int i = 0; i < 100; ++i) {
delete arr[i];
}
如果你像这样创建矢量
vector<Sample*> arr;
for (int i = 0; i < 100; ++i) {
arr.push_back(new Sample());
}
你需要像这样删除
for (int i = 0; i < 100; ++i) {
delete arr[i];
}
删除指针数组 delete[] 数组是合适的,但对于指针向量,我会使用这样的结构:
std::vector<Data*> m_data;
while(!m_data.empty()) delete m_data.back(), m_data.pop_back();
在
std::vector
上调用delete[]
是不正确的C++。当向量超出范围时,或者当您delete
指向它的指针(如果使用 new
在堆上分配(时,该向量将被销毁。但是,在这两种情况下,销毁数组/向量都不会在其包含的指针上调用delete
- 如果您需要释放该内存,则需要遍历并自己执行此操作。
相关文章:
- 无法删除指针,已触发断点
- 删除指针数组 (C++) 中的元素
- 如果我删除指针,我的C++程序会意外删除系统文件吗?
- 为什么const_cast删除指针的恒常性,而不删除指向常量的指针的恒常性?
- 删除指针后内存泄漏
- 这是系统资源吗?(或者我怎么知道我是否需要删除指针) - 在 C++ 中使用 C
- C++ 从 2 组指针中删除指针
- 当删除 [] 指针工作时,为什么无法获得指向的数组大小?
- 在这种情况下,删除指针数组期间会发生什么?
- 在C++中删除指针数组时析构函数崩溃
- 何时/如何在使用指针后正确删除指针?
- 在C++库中,谁应该删除指针、用户或库?
- 删除指针后阻止对象使用 "this"
- 删除指针后C++尝试/捕获
- 删除指针内存分配以避免内存泄漏
- 删除指针时,未分配被释放的 C++ 指针错误
- 如何从抽象类中删除指针
- 我应该在 v8::外部手动删除指针吗?
- 删除指针
- C 如何删除指针的默认对象成员