矢量上的内存集使其大小为 0
memset on vector is making its size 0
我试图清除向量中的所有数据,而不使用 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,从而导致内存泄漏。
幸运,你会崩溃,如果你不幸,你不会。
相关文章:
- 需要找到3个小错误-内存错误
- GCC 带内联汇编和 -Ofast 为内存操作数生成额外的代码
- 为什么 heob 在 QCreator 生成的代码中将这些检测为内存泄漏
- 搜索一组点,其长度总和最小为矩形.算法是什么
- 我如何为程序修复这个小的内存泄漏
- 我应该使用哪种 c++11 范例来最小化内存使用量并最小化复制?
- 为内存管理扩展GCC
- 从 HDF5 文件读取:将 3D 数据转换为内存中的 1D 矢量
- Linux 分配器不会释放小块内存
- 为内存中位图声明缓冲区
- 具有两个原子的自旋锁的最小限制内存排序
- 使用 C++ 在 openCV 中将 Mat 转换为内存
- 如何使用fmod_event获得更小的内存使用量
- 紧凑向量一个小的内存足迹向量
- 是否可以强制GCC为内存对齐的对象生成高效的构造函数
- Qt小部件内存管理
- 在许多malloc/释放小块内存后,未能malloc大块内存
- 动态分配许多小块内存
- mmap小尺寸内存,当munmap为glibc时,会将映射内存释放到操作系统
- C 气泡排序:排序数组丢失最大的数据片段,并替换为内存地址