使用new char[]遇到过的几个坑
2015-11-28 15:44
375 查看
new char[]使用起来很简单,也是最基础的语法,但是在使用过程中还是遇到很多坑。所以提醒自己,重视基础。
1.释放
2.赋值
坑1:将pStr重新指向"Black Friday!Damn it!"字符串,不仅delete时运行时报错(此时的pStr并没有指向堆),并且造成最早分配的内存不能释放。
坑2:使用了strlen()去获取new char[]的空间,造成内存越界。
char *pStr = new char[1024];
cout << strlen(pStr) << endl; //vs2013下输出1028
代码改为:
1.释放
char *p = new char[1024 * 1024 * 100]; cout << "按任意键开始分配内存" << endl; getchar(); cout << "成功分配了100M的内存" << endl; if (p) { cout << "释放所分配的100M内存" << endl; delete[] p;// p = nullptr; }上面必须使用delete[] 而不是delete,不然会内存泄露,部分内存不能得到有效的释放。一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。
2.赋值
坑1:将pStr重新指向"Black Friday!Damn it!"字符串,不仅delete时运行时报错(此时的pStr并没有指向堆),并且造成最早分配的内存不能释放。
cout << "按任意键开始分配内存" << endl; getchar(); char *pStr = new char[1024]; cout << strlen(pStr) << endl; //赋值 pStr = "Black Friday!Damn it!";//将pStr重新指向"Black Friday!Damn it!"字符串,造成最早分配的内存不能释放 cout << pStr << endl; if (pStr) { cout << "释放内存" << endl; delete[] pStr; pStr = nullptr; }
坑2:使用了strlen()去获取new char[]的空间,造成内存越界。
cout << "按任意键开始分配内存" << endl; getchar(); char *pStr = new char[1024]; //赋值 char * tmp = "Black Friday!Damn it!"; strncpy_s(pStr, strlen(pStr), tmp, strlen(tmp));<span style="color:#ff0000;">//内存越界</span> cout << pStr << endl; if (pStr) { delete[] pStr; pStr = nullptr; }
char *pStr = new char[1024];
cout << strlen(pStr) << endl; //vs2013下输出1028
代码改为:
cout << "按任意键开始分配内存" << endl; getchar(); char *pStr = new char[1024]; cout << strlen(pStr) << endl; //赋值 char * tmp = "Black Friday!Damn it!"; strncpy_s(pStr, 1024, tmp, strlen(tmp)); cout << pStr << endl; if (pStr) { delete[] pStr; pStr = nullptr; }
相关文章推荐
- Java注解知识点整理
- hashMap的再认识
- PHP函数操作数组(集合贴)
- NOIP2015总结
- iOS开发:在Xcode中用Pods管理第三方库
- Android Studio jar包的导入
- 静态工厂模式
- 如何将solr5.3.1部署到Tomcat下
- 百度地图API四:实现轨迹动态回放功能
- 【34.7】【H】【leetcode】Trapping Rain Water
- Android 系统稳定性 - ANR(三)
- JNDI到底是什么,有什么作用
- 事件处理响应者链条
- 我的编码经验教训总结
- css text文本属性(二)
- OPENWRT修改MAC(亲测有效)
- jquery+json实现数据二级联动的方法
- nyoj 差值 1233 (大数减法&&字符串排序)
- 虚函数和纯虚函数的作用与区别 http://blog.csdn.net/xwpc702/article/details/8670025
- 1012 最大公约数和最小公倍数问题