1、C++的std::string浅拷贝
这是帮朋友调适出来的一个错误,隐藏得很深,有些诡异。
全局指针 char* filename;
某函数中出现:
function A()
{
std::string file = ;// 此处从其他地方获得文件名
filename = file.c_str(); // 将文件名复制后,然后到其他地方使用
// 这里错了!file是一个局部对象,当程序段离开这里后,file 就销毁了
// filename 指向 就指向了一片垃圾数据
}
function B()
{
// 使用 filename
}
如果两段代码在一个线程内,那么程序B处肯定会出现问题,因为filename指向的对象是垃圾数据。但如果,两段程序出现在两个不同的线程中,那么,表现出来的症状就不是这样了。
线程1:
function A()
{
std::string file = ;// 此处从其他地方获得文件名
filename = file.c_str(); // 将文件名复制后,然后到其他地方使用
wxMessageBox("...message...");// 弹出一个对话框,阻塞这个线程
}
线程2:
function B()
{
// 使用 filename
}
倘若程序段B在关闭对话框之前取出 filename ,那么程序会执行正确;倘若程序段B在关闭对话框之后在取出filename,那么程序就会出现错误。也就是说,在加入了界面与线程以后,问题被隐藏的更深入了。因为它的表现具有一定的随机性,与你关闭对话框的动作相关。filename = file.c_str();是浅拷贝。数据区域并没有被拷贝。倘若将全局变量filename的类型设置为string,然后用filename = file做赋值操作,那么就不会出现这个问题了。因为这是一个深拷贝。
2.c++的std::string与Java的String
以前用Java String的时候,觉得这个类真的很好,屏蔽了太多的底层操作,用起来相当的方便,用c++的string觉得没这么方便了。简单的比较一下一些实现函数,发现c++串的功能并没有这么弱,只是平时用的太少了!
<o:p> </o:p>
|
C++ std::string<o:p></o:p>
|
Java String<o:p></o:p>
|
创建字符串<o:p></o:p>
|
string s(“hehe”);<o:p></o:p>
string s=”hello”;<o:p></o:p>
|
类似<o:p></o:p>
|
访问单个字符<o:p></o:p>
|
s[0] 不会进行范围检查<o:p></o:p>
s.at(0) 会进行范围检查<o:p></o:p>
|
charAt(i)<o:p></o:p>
<o:p> </o:p>
|
字符串比较<o:p></o:p>
|
S1.compare(s2)<o:p></o:p>
等于返回0,大于返回正数<o:p></o:p>
|
compareTo返回整型,>0表示大于,=表示等于<o:p></o:p>
equals返回bool,true表示相等<o:p></o:p>
== 比较两者引用是否相同,不比较内容<o:p></o:p>
|
连接字符串<o:p></o:p>
|
S = s1+s2+s3;<o:p></o:p>
S = s1.append(s2);
只能连接string与char*类型,int,float等不行
|
append()<o:p></o:p>
"+"号功能更强大,不仅能连接串,而且能连接 int,float等类型<o:p></o:p>
|
字符串查找<o:p></o:p>
|
s.find(ss) <o:p></o:p>
|
indexOf<o:p></o:p>
|
字符串替换<o:p></o:p>
|
s.replace(pos,search.size(),search)<o:p></o:p>
|
replace<o:p></o:p>
|
提取字串<o:p></o:p>
|
s.substr(startpos,len)<o:p></o:p>
|
substring<o:p></o:p>
|
删除与插入字串<o:p></o:p>
|
insert<o:p></o:p>
erase<o:p></o:p>
|
delete<o:p></o:p>
insert<o:p></o:p>
|
其他<o:p></o:p>
|
string定义为typedef basic_string <char> string<o:p></o:p>
|
当字符串经常发生变化时,需要用StringBuffer替换String;
|
分享到:
相关推荐
详解C++中String类模拟实现以及深拷贝浅拷贝 在C语言中/C++中,字符串是一个应用很广泛的类型,也是很基础的类型,C语言并没有直接处理字符串的操作而是采用字符指针和字符串数组进行操作,而在C++中标准库为我们...
c++string类源码 包括拷贝构造函数,生拷贝浅拷贝,追加函数,赋值函数,字符串比较函数,重载运算符等等
其中还关注了深拷贝的问题(由于string类中涉及内存资源的管理,而默认的拷贝构造函数或是赋值重载只能实现浅拷贝,因此在该类中应自己编写拷贝构造函数和赋值重载)、流插入操作符重载对于字符串中的空格输出的问题...
利用输入字符串流:std::istringstream 代码如下:bool b;std::string s = “true”;std::istringstream(s) >> std::boolalpha >>... 您可能感兴趣的文章:详解C++中String类模拟实现以及深拷贝浅拷贝自己模拟写C++中的St
1、讲解字符串类的原理与代码实现过程; 2、讲解深拷贝与浅拷贝的原理和应用;
1、通过拷贝构造函数与operator=操作符讲解和演示深拷贝与浅拷贝的差别; 2、讲解和演示拷贝构造函数和operator=功能开发以及二者的应用上的差别; 3、讲解类型转换操作符与拷贝构造在开发中的应用;
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
19_深拷贝和浅拷贝_默认的等号操作符也是浅拷贝_传智扫地僧 20_构造函数的初始化列表 21_强化训练1_构造和析构调用顺序 22_强化训练2_匿名对象生命周期 23_强化训练3_构造中调用构造(产生匿名对象)_传智扫地僧 24_...
vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 ...
便自动成为inline候选人函数符重载字符串小结(具体代码见string.h)防卫式声明类名数据放在private中函数放在public中构造函数,拷贝构造函数,拷贝赋值值函数,析构函数(数组删除) 带有指针成员的类,必须有copy...
vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 ...
vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 ...
vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 ...
vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 ...
C++ 泛型编程系列讲座之实施 泛型技巧系列:简单类型选择器 C# 泛型简介 我眼中的C#2.0新功能特性 泛型技巧系列:避免基类及接口约束 New Article 不该用Generics实现Abstract Factory的理由 C#2.0-泛型 C#2.0-...