实战c++中的string系列--不要使用memset初始化string(一定别这么干)
參考链接:
http://www.cppblog.com/qinqing1984/archive/2009/08/07/92479.html
百度百科第一次这么给力:
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 name
char 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 name
std::string textureTransName; // transparent texture name
};
上面的代码会造成内存泄露:
所以对于C++的std::string来说。要使用C++风格的初始化。
在网上看到这样一条评论。认为有道理:
不论什么类都不能用memset, 一旦暴力,就等于你强奸了她的内部数据。她已经崩溃了
实战c++中的string系列--不要使用memset初始化string(一定别这么干)的更多相关文章
- 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)
string.vector 互转 string 转 vector vector vcBuf;string stBuf("Hello DaMao!!!");----- ...
- 实战c++中的vector系列--知道emplace_back为何优于push_back吗?
上一篇博客说道vector中放入struct.我们先构造一个struct对象.再push_back. 那段代码中,之所以不能使用emplace_back,就是由于我们定义的struct没有显示的构造函 ...
- 实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)
之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中.vector A中的结果我们可想而知,可是vector B中的元素还会怎样? 看看之前写过的程序: ...
- 实战c++中的vector系列--vector应用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)
使用vector容器,即避免不了进行查找,所以今天就罗列一些stl的find算法应用于vector中. find() Returns an iterator to the first element ...
- 实战c++中的vector系列--copy set to vector(别混淆了reserve和resize)
stl算法中有个copy函数.我们能够轻松的写出这种代码: #include <iostream> #include <algorithm> #include <vect ...
- 实战c++中的vector系列--将迭代器转换为索引
stl的迭代器非常方便 用于各种算法. 可是一想到vector.我们总是把他当做数组,总喜欢使用下标索引,而不是迭代器. 这里有个问题就是怎样把迭代器转换为索引: #include <vecto ...
- 实战c++中的vector系列--构造、operator=和assign差别
vector或许是实际过程中使用最多的stl容器.看似简单,事实上有非常多技巧和陷阱. 着重看一看vector的构造,临时依照C++11: default (1) explicit vector (c ...
- 实战c++中的vector系列--creating vector of local structure、vector of structs initialization
之前一直没有使用过vector<struct>,如今就写一个简短的代码: #include <vector> #include <iostream> int mai ...
- 实战c++中的vector系列--emplace_back造成的引用失效
上篇将了对于struct或是class为何emplace_back要优越于push_back,可是另一些细节没有提及.今天就谈一谈emplace_back造成的引用失效. 直接撸代码了: #inclu ...
随机推荐
- hbase1.4.0安装和使用
jia下载地址: http://mirrors.shuosc.org/apache/hbase/1.4.0/ 解压 tar -zxvf hbase-1.4.0-bin.tar.gz 修改环境变量 [ ...
- CentOS防SYN攻击
netstat -anp |awk '{print $6}'|sort|uniq -c |sort -rn 172 ESTABLISHED 59 CONNECTED 589 SYN_RECV 15 S ...
- jquery 异步处理
<!DOCTYPE html> <head> <script type="text/javascript" src="jquery-1.12 ...
- 百度网盘 http://pandownload.com/index.html
https://github.com/high-speed-downloader/high-speed-downloader
- 百度地图Api进阶教程-实例高级操作8.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- PCL点云分割(1)
点云分割是根据空间,几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征,点云的有效分割往往是许多应用的前提,例如逆向工作,CAD领域对零件的不同扫描表面进行分割,然后才能更好的进行空洞 ...
- Prolog学习:用八卦的精神走进Prolog
最近枕头书是<七周七语言:理解多种编程范型>这本,前面两章分别看了Ruby和IO,都是命令式语言.虽然它们在语法上跟之前接触过的C,C#,Java这些C家族的语言差别很大,但是编程范型却是 ...
- SpringMVC系列(二): SpringMVC各个注解的使用
1.@RequestMapping 1.@RequestMapping除了能修饰方法,还能修饰类(1)修饰类:提供初步的请求映射信息,相对于web请求的根目录(2)修饰方法:提供进一步的细分映射信息相 ...
- 使用Maven清理项目
在基于Maven的项目中,很多缓存输出在“target”文件夹中.如果想建立项目部署,必须确保清理所有缓存的输出,从面能够随时获得最新的部署. 要清理项目缓存的输出,发出以下命令: mvn clean ...
- 查询sql server 表结构
select column_name,data_type from information_schema.columns where table_name = '表名'