矢量上的内存集使其大小为 0

memset on vector is making its size 0

本文关键字:小为 内存      更新时间:2023-10-16

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

我试图清除向量中的所有数据,而无需使用 memset 更改其大小。

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

请改用std::fill

std::fill(buckets[0].begin(), buckets[0].end(), 0);
更不用说

非 POD 上的memset未定义的行为,看起来您刚刚"成功"memset - 处理向量的内部数据 - 这可能是指向实现的指针或指向底层数组开始/结束的指针。您没有修改元素,实际上丢失了它们(并泄露了内存(。

您很可能希望在底层阵列上进行操作(尽管如此,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])为您提供了此场合完全毫无意义的数字。

不要那样做。破坏class实例的自动存储可能会导致未定义的行为。例如,我想不会调用向量元素的任何析构函数。

resize归零将实现基本相同的目标。或者只是将buckets重新分配给std::vector<T>的新实例。

你正在对一个类做memset,这充其量是未定义的行为。您如何知道对象使用的内存为零的设置对对象有意义?例如,如果向量存储指向它所包含的项的指针,则您已将该指针设置为 null,从而导致内存泄漏。

如果你

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