【问题标题】:Why clear() used on vector of vectors doesn't clear the values of those vectors? [closed]为什么在向量向量上使用的 clear() 不会清除这些向量的值? [关闭]
【发布时间】:2020-07-06 11:00:14
【问题描述】:

我非常确定 vector 调用了包含对象的析构函数,我只是在主向量上使用了 clear(),然后我重用了该向量,并且存储在其中的向量的值没有被清除...

编辑 - 代码:

vector<vector<int> > flush1;
flush1.reserve(4);
for(int i = 0; i != 4; ++i) flush1[i].reserve(7);
flush1.clear();
flush1[0].push_back(some_int);
flush1[1].push_back(some_int);
flush1[2].push_back(some_int);
flush1[3].push_back(some_int);
cout the size from flush1[0-3];
flush1.clear();

一次又一次

flush1[0].push_back(some_int);
flush1[1].push_back(some_int);
flush1[2].push_back(some_int);
flush1[3].push_back(some_int);

并从flush1[0-3]中计算大小 cout-s 他们以前的大小+新大小(新旧相加)

【问题讨论】:

  • 好的,但我需要时间从我的代码中选择这些部分。
  • 你的代码错了,和/或你对容器的理解错了。没有任何合法的方式可以让您得出“元素仍然存在”的结论。
  • 存储在其中的向量没有被清除,它们被销毁了。在你调用clear() 之后,主向量没有元素,这就是清楚的重点。因此,您无法确定“存储在其中的向量”是否已清除。里面没有存储向量。
  • 问题是,你是如何“重用”向量的?
  • 我编辑了这个问题,我并不是说这是不好的 C++ 行为,我只是不知道为什么它不清除存储的向量。

标签: c++ vector stdvector


【解决方案1】:

vector 对象具有三个指针:开始、结束和 end-of-reserved-storage。

clear() 方法在每个包含的对象上调用析构函数,然后将结束指针设置为开始。

所以被破坏对象的数据在保留的存储中仍然是可见的(例如使用调试器)。

【讨论】:

  • 所以你不认为在清除其中存储的那些向量的主向量之后仍然包含信息是不好的,即使它们不再存在于我的代码中?
  • 信息还在,但可以认为是“垃圾”。计算机的 RAM 和硬盘中随时都有大量垃圾。这很正常。
猜你喜欢
  • 2015-02-12
  • 2019-09-19
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
相关资源
最近更新 更多