C++ 一些需要注意的地方

1.
对于sizeof计算数组长度:
1)栈内数组,如char buf[20],那么sizeof(buf)=20
 2)堆内数组,栈内指针,如char *buf=new char[20],那么sizeof(buf)=4,实际上是buf指针的长度,而非数组的长度,这需要注意

2.
使用strcat时需要注意,新加的字符串是接到原字符串的末尾,即‘\0’后面,有时在 堆上开辟一段空间(new 出来的),没有将此空间清0,而直接使用strcat,结果是字符串放不进去,因为空间内可能就没有‘\0’,除非此空间首元素就是‘\0’,否则都会导致意外的结果(在栈内申请的空间似乎可以不考虑此问题,默认内容都是0)。

3.
fgetwc()似乎并没有让指针移动2个字节,仍然只移动一个字节,只不过将返回值转成为wchar

4.
windows 下进行字符集编码转换可使用 WideCharToMultiByte和MultiByteToWideChar,需要包含头文件<windows.h>
linux下没有<windows.h>,无法使用这两个函数,但有两个简洁的替代函数: wcstombs()和mbstowcs(),
唯一需要注意的是如果字符串为中文,则必须在程序中先调用setlocale()来定义当前的 locale语言
(此函数需要包含头文件<locale.h>),如setlocale (LC_ALL, "chs");(设置中文),但我用cygwine的G++时,
设置"chs",调试发现转换并不成功(wcstombs返回值始终为-1),无意间将“chs”变为“”,
屏幕才正常显示中文(说明转换成功了),原因仍未知。
举个例子:
   int nConv=wcstombs(str, (const wchar_t*)raw, len);
 string *s=new string(str,nConv);
其中str和raw都是char数组,长度都是len,也最好设置它俩长度相等,因为转换后的多字节字符串可能和原宽字符的字符串长度差不多(对于中文就是这样,对于英文可能只有原来的一半长度了,要是中英混合,长度就不定了)。
5.
对于内存溢出的检测,VC++  里面比较简单,使用 Visual Leak Detector就可以,简单易用,只需添加一个头文件<vld.h>,或许还需要将一些dll搬到程序目录下,然后就是把include和lib路径添加到编译器的搜寻路径中,然后就没了,运行完程序它就可以报告有多少内存没回收了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值