C++ string中的几个小陷阱,你掉进过吗?
发布日期:2021-08-17 08:27:55 浏览次数:9 分类:技术文章

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

C++开发的项目难免会用到STL的string。使用管理都比char数组(指针)方便的多。但在得心应手的使用过程中也要警惕几个小陷阱。避免我们项目出bug却迟迟找不到原因。

1.  结构体中的string赋值问题

直接通过一个样例说明,以下的样例会输出什么:
#include 
#include
#include
using namespace std;struct flowRecord { string app_name; struct flowRecord *next;};int main() {    flowRecord *fr = (flowRecord*)malloc(sizeof(flowRecord));    fr->app_name = "hello";    cout << fr->app_name << endl;    return 0;}
嗯,当然不是简单的输出“hello”了,在Linux下用g++编译后执行试试,会出现“Segmentation fault (core dumped)”,why?问题就出在给fr指针分配内存的时候,注意这里用的是C中的malloc而不是new。假设你换成new再执行,就不会报错了,成功的输出“hello”,那为什么malloc就不行呢?这就要看malloc()与new()的差别了,关于两者的差别是程序猿面试中屡问不爽的经典面试题,所以相信一般的程序猿都知道它们之间有一个很重要的差别就是:new在分配内存时会调用默认的构造函数,而malloc不会调用

而STL的string在赋值之前须要调用默认的构造函数以初始化string后才干使用。如赋值、打印等操作,假设使用malloc分配内存。就不会调用string默认的构造函数来初始化结构体中的app_name字符串,因此这里给其直接赋值是错误的,应该使用new操作符。这也提示我们用C++开发程序时,就尽量使用C++中的函数,不要C++与C混合编程,导致使用混淆。比方有时候new分配的内存却用free释放

2. c_str()函数问题

c_str()函数用于string与const char*之间的转换,也常常能用到。以下的样例你说输出啥?
#include 
#include
using namespace std;int main() { string s = "Alexia"; const char *str = s.c_str(); cout << str << endl; s[1] = 'm'; cout << str << endl; return 0;}
嗯,第一个不用多说,第二个输出是“Alexia”还是“Amexia”呢?答案是后者,咋一看const char*的值应该是个常量啊,怎么还能改变值呢?哈。又是个经典的面试题:const char*, char const*, char* const的差别
是什么?老生常谈的问题,const char*与char const*是等价的,指的是指向字符常量的指针,即指针能够改变指向但其指向的内容不能够改变,而char* const相反,指的是常量指针,即指向不能够改变但指针指向的内容能够改变。因此这里的const char*指向的内容本类是不能够改变的,那么这里为什么改变了呢?这跟str这个const char*的生命周期及string类的实现有关,string的c_str()返回的指针是由string管理的,因此它的生命期是string对象的生命期。而string类的实现实际上封装着一个char*的指针,而c_str()直接返回该指针的引用,因此string对象的改变会直接影响已经执行过的c_str()返回的指针引用。
3. 字符串字面值与标准库string不是同一种类型
直接看以下的样例:
string s("hello");cout<
<
能够看出两者是很不同的。不能混淆使用。

转载于:https://www.cnblogs.com/lxjshuju/p/6920235.html

转载地址:https://blog.csdn.net/weixin_30843605/article/details/95272167 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:iOS获取当前设备方向
下一篇:Codeforces Little Dima and Equation 数学题解

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月19日 21时46分42秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java root权限_android java获得root权限调用linux命令 | 学步园 2019-04-21
java最小化窗体_JAVA窗体最大化最小化控制+托盘 2019-04-21
java 注解 数组默认值_Java注解默认值 2019-04-21
java流程语句_Java流程控制语句 2019-04-21
java require_java正则中的requireEnd和hitEnd 2019-04-21
400错误java_java代码转化成c#代码 报400错误 2019-04-21
java常见对象_Java 常见对象 02 2019-04-21
spring java配置_Spring Java配置要点 2019-04-21
共享内存 java_java - Java客户端-服务器编程:客户端之间的共享内存 - 堆栈内存溢出... 2019-04-21
java布局管理器空布局_Java图形化界面设计——布局管理器之null布局(空布局)... 2019-04-21
java gas station_LeetCode – 774. Minimize Max Distance to Gas Station 2019-04-21
java项目无法加载到tomcat_eclipse+tomcat添加项目进来无法启动tomcat 2019-04-21
后缀树建立 java_实用算法实现-第 8 篇后缀树和后缀数组 [2 最长公共子串] 2019-04-21
java网络编程期末试题_java网络编程面试题【其中一小部分】 2019-04-21
estore java_estore2 - WEB源码|JSP源码/Java|源代码 - 源码中国 2019-04-21
java如何做表单校验_微信小程序实现表单校验功能 2019-04-21
matlab dwt2(),MATLAB小波变换指令及其功能介绍(超级有用) 2019-04-21
php sequelize,egg.js整合数据库ORM框架Sequelize 2019-04-21
php同时打开2个数据库,thinkphp3.2同时连接两个数据库的简单方法 2019-04-21
centos 开发php扩展,centos 安装php扩展redis 2019-04-21