##實戰c++中的string系列--不要使用memset初始化string(一定別這么干)
參考鏈接:?
[http://www.cppblog.com/qinqing1984/archive/2009/08/07/92479.html](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, 一旦暴力,就等于你強奸了她的內部數據,她已經崩潰了**
- 前言
- string與整型或浮點型互轉
- 指定浮點數有效數字并轉為string
- string的替換、查找(一些與路徑相關的操作)
- string的分割、替換(類似string.split或是explode())
- string的初始化、刪除、轉大小寫(construct erase upper-lower)
- string的遍歷(使用下標還是iterator)
- std::string與MFC中CString的轉換
- string到LPCWSTR的轉換
- std:vector<char> 和std:string相互轉換(vector to stringstream)
- CDuiString和string的轉換(duilib中的cduistring)
- string的連接(+= or append or push_back)
- 函數返回局部變量string(引用局部string,局部string的.c_str()函數)
- 將string用于switch語句(c++做C#的事兒, switch中break還是return厲害)
- 不要使用memset初始化string(一定別這么干)