标签:style blog class code java ext
C++开发的项目难免会用到STL的string,使用管理都比char数组(指针)方便的多,但在得心应手的使用过程中也要警惕几个小陷阱,避免我们项目出bug却迟迟找不到原因。
#include <iostream> #include <string> #include <stdlib.h> using namespace std; struct flowRecord { string app_name; struct flowRecord *next; }; int main() { flowRecord *fr = (flowRecord*)malloc(sizeof(flowRecord)); fr->app_name = "hello"; out << 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释放。
#include <iostream> #include <string> 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; }
string s("hello"); cout<<s.size()<<endl; //OK cout<<"hello".size()<<endl; //ERROR cout<<s+"world"<<endl; //OK cout<<"hello"+"world"<<endl; //ERROR
可以看出两者是非常不同的,不能混淆使用。
C++ string中的几个小陷阱,你掉进过吗?,布布扣,bubuko.com
标签:style blog class code java ext
原文地址:http://www.cnblogs.com/lanxuezaipiao/p/3704578.html