博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实战c++中的string系列--不要使用memset初始化string(一定别这么干)
阅读量:6804 次
发布时间:2019-06-26

本文共 1554 字,大约阅读时间需要 5 分钟。

參考链接:

百度百科第一次这么给力:

void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

memset:作用是在一段内存块中填充某个给定的值。它是对较大的结构体或数组进行清零操作的一种最快方法。

memset() 函数经常使用于内存空间初始化:

 

 char str[100]; memset(str,0,100);

用来对一段内存空间所有设置为某个字符,一般用在对定义的字符串进行初始化为‘

memset(a, '\0', sizeof(a));

memcpy用来做内存拷贝,你能够拿它拷贝不论什么数据类型的对象,能够指定拷贝的数据长度:  

char a[100], b[50];memcpy(b, a, sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。

strcpy就仅仅能拷贝字符串了,它遇到’\0’就结束拷贝:

  

char a[100], b[50];strcpy(a,b);

如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。

  

以下開始:

class Material{public:    Material(){ setDefaults();}    void setDefaults(){ memset(this,0,sizeof(*this));}    int mark;    char materialName[256]; // material name    Vector3 ambient;    // ambient    Vector3 diffuse;    // diffuse    Vector3 specular;   // specular    int shininess;  //    float alpha;    //    bool isSpecular;char textureName[256];  // texture namechar textureTransName[256]; // transparent texture name};

这段代码完美无瑕。再看看以下的:

class Material{public:    Material(){ setDefaults();}    void setDefaults(){ memset(this,0,sizeof(*this));}    int mark;    std::string materialName;   // material name    Vector3 ambient;    // ambient    Vector3 diffuse;    // diffuse    Vector3 specular;   // specular    int shininess;  //    float alpha;    //    bool isSpecular;std::string textureName;    // texture namestd::string textureTransName;   // transparent texture name};

上面的代码会造成内存泄露:

所以对于C++的std::string来说。要使用C++风格的初始化。

在网上看到这样一条评论。认为有道理:

不论什么类都不能用memset, 一旦暴力,就等于你强奸了她的内部数据。她已经崩溃了

转载地址:http://uctwl.baihongyu.com/

你可能感兴趣的文章
Android实现登录小demo
查看>>
AgentWeb是基于Android WebView一个功能完善小型浏览器库
查看>>
开放数据中心联盟推8个云计算应用模型
查看>>
学习数据分析的“里程碑”是什么?
查看>>
数据科学与DevOps之间的差距还有救吗?
查看>>
信息化一周回顾:金融业大数据十大趋势
查看>>
Http、TCP/IP协议与Socket之间的区别
查看>>
文思海辉:智慧数据避免企业成为大数据时代落伍者
查看>>
迅雷发布“星域CDN” 做条颠覆市场的鲶鱼
查看>>
英国《数字经济法案》
查看>>
Asp.net与Flex交互测试记录
查看>>
大厂前端高频面试问题与答案精选
查看>>
C# 7编程模式与实践
查看>>
如何在Kubernetes中暴露服务访问
查看>>
SignalR Core尝鲜
查看>>
11个Visual Studio代码性能分析工具
查看>>
火掌柜iOS端基于CocoaPods的组件二进制化实践
查看>>
从责任界定和问题预警角度 解读全栈溯源对DevOps的价值
查看>>
【mysql的编程专题①】流程控制与其他语法
查看>>
[译] 实例解析 ES6 Proxy 使用场景
查看>>