千万不要对vector之类的容器使用memset

本文探讨了一个内存泄露现象,发现是由于在使用memset置零一个包含vector成员的结构体时,破坏了vector内部结构所引起。通过手工初始化解决了问题,提醒开发者在使用STL容器时注意内存安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近写了个非常简单的内存池,但是在使用的过程中却发现有内存泄露的现象。

花了很多时间去跟踪和测试代码,最终发现在分配和回收一个带有vector成员的结构体时,对这个结构体进行了memset置零,结果导致程序出现了莫名其妙的内存泄露。

后来对这个结构体的初始化进行了手工赋值,程序一切正常。


看来memset会破坏vector的内部的结构,导致出现内存泄露的问题。以后用vector、string之类的stl容器时要注意了。

### C++ 中 `memset` 函数的使用方法 在 C++ 编程中,`memset` 是一个非常常用的函数,主要用于初始化一块连续的内存区域。以下是关于该函数的具体说明及其用法。 #### 基本定义 `memset` 的功能是在指定的一段内存区域内填充某个给定的值。其函数原型如下: ```cpp void* memset(void* s, int c, size_t n); ``` - 参数 `s` 表示目标内存块的起始地址。 - 参数 `c` 是用来填充的目标值,注意此值会被自动转换为无符号字符 (`unsigned char`) 类型[^2]。 - 参数 `n` 则表示需要被设置为目标值的字节数量[^4]。 #### 示例代码解析 下面提供了一个具体的例子来展示如何利用 `memset` 对数组进行初始化: ```cpp #include <iostream> #include <cstring> // 包含头文件以支持 memset 函数 using namespace std; int main(){ char str[10]; // 设置字符串最后一个位置为 'w' str[9] = 'w'; // 使用 memset 将前九个字符设为 ASCII 码 97 ('a') memset(str, 97, 9); // 输出整个字符串的内容 for (int i = 0; i < 10; ++i){ cout << str[i] << " "; } return 0; } ``` 上述程序会打印出类似于这样的结果:“a a a a a a a a a w”。这是因为我们先通过 `memset` 把前面九个元素都赋成了字母 ‘a’(ASCII码97),而第十个保持原样即‘w’[^1]。 #### 关键点提醒 需要注意的是当运用 `memset` 进行数据类型的处理时,比如整数或者浮点数等复杂的数据类型,由于它们可能跨越多个字节存储于计算机之中,因此简单地应用单一数值可能会引发意想不到的结果。例如对于结构体成员变量如果是布尔型(bool)或者是枚举(enum),则可以直接采用这种方式来进行批量置零操作;但对于其他更复杂的场景,则需谨慎对待[^3]。 #### 注意事项 最后强调一点就是虽然可以很方便快捷地借助 `memset` 来完成一些简单的初始化工作,但在实际开发过程中还是推荐尽可能多地依赖现代C++特性所提供的容器类(如vector,std::array)自带的方法来做这些事情,这样不仅能够提高可读性和维护性,而且还能减少潜在错误的发生几率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值