我试图清除矢量中的所有数据而不使用memset
更改其大小。但是在memset
向量的操作大小变为0之后。这是确切的代码:
std::vector<T> buckets[2];
MAX_BUCKET_SIZE=16;
构造
buckets[0].resize(MAX_BUCKET_SIZE);
std::cout << "Actual size0 " << buckets[0].size() << std::endl;
buckets[1].resize(MAX_BUCKET_SIZE);
std::cout << "Actual size1 " << buckets[1].size() << std::endl;
在一个函数中:
std::cout << "Actual size2 0 " << buckets[0].size() << std::endl;
std::cout << "Actual size2 1 " << buckets[1].size() << std::endl;
...
...
while (...){
delete_data(current_bucket);
std::cout << "current bucket ** " << current_bucket << std::endl;
std::cout << "Actual size3 0 " << buckets[0].size() << std::endl;
std::cout << "Actual size3 1 " << buckets[1].size() << std::endl;
}
delete_data
功能:
memset(&buckets[bucket_id], 0, sizeof(buckets[bucket_id]));
输出:
Actual size0 16
Actual size1 16
Actual size2 0 16
Actual size2 1 16
current bucket ** 1
Actual size3 0 16
Actual size3 1 0
current bucket ** 0
Actual size3 0 0
Actual size3 1 0
答案 0 :(得分:7)
我试图清除矢量中的所有数据而不使用
memset
更改其大小。
它不会起作用,因为它没有注意被填充的区域。在使用指针实现std::vector
的情况下,应用它的方式也会造成内存泄漏,因为指针已被清零。
改为使用std::fill
:
std::fill(buckets[0].begin(), buckets[0].end(), 0);
答案 1 :(得分:3)
更不用说memset
非POD是未定义的行为,看起来你刚刚“成功”memset
- 向量的内部data - 可以是指向实现的指针或指向底层数组的开始/结束的指针。你没有修改元素而你实际上已经丢失了它们(并泄露了内存)。
你很可能想要对底层数组进行操作(仍然,T
必须是POD):
memset(&buckets[bucket_id].front(), 0, buckets[bucked_id].size() * sizeof(T));
但是没有人在C ++中这样做,因为有一些STL解决方案,比如std::fill
:
std::fill(buckets[bucket_id].begin, buckets[bucket_id].end(), T{});
将使用默认构造的T
(可以是非POD)的副本填充数组。
还要注意sizeof(buckets[bucket_id])
为这个场合提供完全没有意义的数字。
答案 2 :(得分:1)
不要那样做。破坏class
实例的自动存储可能会导致未定义的行为。例如,我想象不会调用向量元素的任何析构函数。
将resize
调用为零将实现基本相同的事情。或者只是将buckets
重新分配给std::vector<T>
的新实例。
答案 3 :(得分:1)
你正在对一个类进行memset
,这是最好的未定义行为。你怎么知道对象使用的内存设置为零对于对象有意义?例如,如果向量存储指向它包含的项的指针,那么您将该指针设置为null,从而导致内存泄漏。
如果你很幸运,你会崩溃,如果你不幸,你就不会。