向量上的memset使其大小为0

时间:2016-02-16 10:45:05

标签: c++ vector memset

我试图清除矢量中的所有数据而不使用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

4 个答案:

答案 0 :(得分:7)

  

我试图清除矢量中的所有数据而不使用memset更改其大小。

它不会起作用,因为它没有注意被填充的区域。在使用指针实现std::vector的情况下,应用它的方式也会造成内存泄漏,因为指针已被清零。

改为使用std::fill

std::fill(buckets[0].begin(), buckets[0].end(), 0);

答案 1 :(得分:3)

更不用说memsetPOD未定义的行为,看起来你刚刚“成功”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,从而导致内存泄漏。

如果你很幸运,你会崩溃,如果你不幸,你就不会。