c++ - 在 C++ 中删除 vector 的单个元素的问题

标签 c++ vector destructor

#include <vector>
#include <iostream>
#include <memory>
using namespace std;
class Test
{
  public:
  Test (){  cout<<"Const\n"; }
  ~Test (){  cout<<"Dest\n"; }
};
int main( )
{
    vector<Test *> tVec;
    tVec.push_back(new Test());
    tVec.push_back(new Test());
    tVec.insert(tVec.end(),new Test());
    tVec.emplace(tVec.end(),new Test[4]);
    vector<Test *>::iterator it;
    for(it = tVec.begin(); it != tVec.end(); it++)
    {
         delete *it;
         it = tVec.erase(it);
    }
    return 0; 
}

输出:

常量 常量 常量 常量 常量 常量 常量 目的地 目的地

只调用了两个析构函数,而调用了8个构造函数。我知道我创建的最后四个对象是一个数组。是否有任何通用的方法来删除 vector 中的单个对象。第二如何访问这些单独的数组元素。

最佳答案

(正式地,您的程序的行为是未定义:您必须永远new[]delete 混合:每个 new 必须与 delete 平衡,并且每个 new[]delete[] 平衡.)

it = tVec.erase(it);it++ 循环中的 for 的交互为您提供 gyp。 (erase 返回的迭代器已经是下一个)。

您错过了所有其他 vector 元素。

for 循环(我的首选)中删除增量语句,一切都会好起来的。

至于通用方式,如果您改用 std::vector<std::unique_ptr<Test>>,那么更简单、更可靠的 tVec.clear() 就可以完成这项工作。或者使用 std::vector<Test> 并使用 (i) 安置和 (ii) 信任您的编译器,以避免任何值复制。

关于c++ - 在 C++ 中删除 vector 的单个元素的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36499828/

相关文章:

c++ - vector 构造函数/析构函数调用

c++ - 有没有一种特殊的方法来声明/定义 C++ 构造函数(和析构函数)

c++ - 为什么 vsnprintf 是安全的?

c++ - 在使用 Cap'n'Proto 进行序列化的同时流式传输

c++ - 无法将参数从 'LPITEMIDLIST *' 转换为 'LPCITEMIDLIST *'

c++ - vector::erase() 未按预期工作

c++ - 类似于大量项目的双端队列,但少量的内存使用量很小?

c++ - 删除运算符,它们等同于 C++ 中的析构函数

python - 未调用 PyBind11 析构函数?

c++ - Windows 手机 : Log to console