c/c :string.c-尊龙官方平台

c/c :string.c_str()

el/2024/3/25 16:59:51

c/c :string.c_str()

今天忽然想起之前的一个小问题:

string.c_str()返回值失效的问题。

关于string.c_str()我个人认为,能多快将其拷贝到一个安全的地方,就尽快将其拷贝吧!

题外话:其实例如lua对c的接口中:lua_pushstring (lua_state *l, const char *s)中,就是把字符串s拷贝到栈上,然后返回。在这里就类似strcpy等将c_str()的内容拷贝出来了,也就“放心了”!

请看如下代码:

string foo()
{string s_subfun = "hello, world!";return s_subfun;
}int main()
{string s_mainfun = foo();return 0;
}

注意,实际上涉及到了三个string对象:

1.s_subfun;
2.s_mainfun;
3.是在foo函数返回时,还会创建一个新的临时对象。

恩,上面要注意第三点,是个临时对象。


如何使用c_str()最保险?

就如同上面的code一样:

string s_mainfun = foo();

关键是要有一个自己声明的对象来接收foo()返回的值(姑且这么叫吧)。

用s_mainfun来接收了foo()返回的值。

以下使用是有问题的:

string foo()
{string s_subfun = "hello, world!";return s_subfun;
}int main()
{const char *s = (foo()   "test1280").c_str();cout<return 0;
}

我这里虽然能正常输出,但是我认为其极有可能出问题(事实上就是会出问题)。

因为在 的地方实际是新构建了一个临时对象,然后对其进行c_str()调用,然后返回c_str()的值,然后:

这个临时变量析构,但是是在啥时候析构?能保证一定在当前的栈调用完毕时才析构吗?不知道!

但是不论如何,有两条准则是很重要的:

1.在调用c_str()时,注意其对象的状态,是个临时变量还是个局部变量?

2.调用c_str()后,尽可能快地用strcpy等拷贝函数将其拷贝到一个自己“放心”的地方,这不就是君子不立危墙之下吗?

还有几点需要说下。

(1)

string.c_str()返回的是一个const类型值,你说你将其强制转换成非const然后再操作是个啥意思?

int main()
{string str = "test1280";char *s = (char *)str.c_str();cout<<str<0] = 'n';cout<<str<

output:

test1280
nest1280

(2)

对字符串的修改可能改变c_str()返回值指向的字符串的内容。

int main()
{string str = "test1280";const char *s = str.c_str();cout<str[2] = 'x';cout<

output:

test1280
text1280

还是那句话:要尽可能快地用strcpy等拷贝c_str()指向的字符串到咱自己地盘,这才放心!

你不知道(记不清),啥时候你就不小心改了字符串string了,而这个有可能影响c_str()指向的字符串的值。

reference:

c_str() 获得的指针可能被下列行为非法化:传递给任何非标准库函数字符串的非 const 引用,或
在字符串上调用非 const 成员函数,包括 operator[]at()front()back()begin()rbegin()end()rend() 。通过 c_str() 写入字符数组是未定义行为。

回归原主题:

对c_str()的使用,要注意其对象的状态,是临时变量还是局部变量?

能确定c_str()后,要尽可能将其复制出来,万一你不小心改变了对象的值,会导致c_str()指向的字符数组内容发生改变~失效!

参考资料:

1.http://blog.csdn.net/nemo2011/article/details/19921605
2.https://my.oschina.net/ioslighter/blog/361046
3.http://blog.csdn.net/wangshubo1989/article/details/50286985
4.http://blog.csdn.net/u013682388/article/details/39547773


http://www.ngui.cc/el/5127138.html

相关文章

aix:struct dirent d_type

aix:struct dirent d_type 今天做一个小功能,实现起来时需要判断一个目录下各个目录项对应的类型: 可能是普通文件类型; 可能是目录类型; 可能是socket类型… #include #include #include …

des加解密原理及实现

des加解密原理及实现 这几天在写加解密相关的api,用来给lua进行调用,其中一个加解密的算法是des,底层是c/c实现的。 当然我不是真的写一个des加解密的实现,而是写一个接口就好。 顺便也了解了下des加解密的相关事项,…

填充模式:pkcs#5/pkcs7

填充模式:pkcs#5/pkcs7 首先我们要了解下啥是填充模式。 在分组加密算法中(例如des),我们首先要将原文进行分组,然后每个分组进行加密,然后组装密文。 其中有一步是分组。 如何分组? 假设我…

linux:静态函数库(.a)与动态函数库(.so)

linux:静态函数库(.a)与动态函数库(.so) 函数库分两种: 1.静态函数库:库程序是直接注入目标程序的,不分彼此,库文件通常以.a结尾; 2.动态函数库:…

linux:多线程不同步导致错误示例

linux:多线程不同步导致错误示例 多个线程都可以看到同一个对象并有对其操作时涉及到同步问题。 不同步现象: counter.h #ifndef _counter_h #define _counter_hclass counter { public:counter();counter(int);virtual ~counter();int getcnt();voi…

c/c :使用dlopen、dlsym、dlclose运行时装载动态库

c/c:使用dlopen、dlsym、dlclose运行时装载动态库 一个可执行程序可能与多个动态库有关联,通常是在程序运行时将必要的动态库装载入进程实体(内存中); 另外一种则是使用dlopen/dlsym/dlclose来动态地将动态库装载到当…

c/c :多线程下使用dlopen、dlsym、dlclose装载动态库

c/c:多线程下使用dlopen、dlsym、dlclose装载动态库 当在多线程下dlopen同一个动态库,使用的会是同一个动态库实例还是不同的动态库实例呢? count.h #ifndef _count_h #define _count_h#include int count; pthread_mute…

c/c :多进程使用dlopen、dlsym、dlclose装载动态库

c/c:多进程使用dlopen、dlsym、dlclose装载动态库 曾经我天真地以为,动态库是装载到内存(操作系统)中,如果有多个进程同时dlopen同一个动态库,应当是在os中仅仅有一份动态库实例,当然ÿ…

c/c :pthread_cond_timedwait阻塞失败(立刻超时返回)

c/c:pthread_cond_timedwait阻塞失败(立刻超时返回) 前几天在现网部署软件时,发现一个进程占用cpu非常非常高,仔细探查原因,发现是处理消息时pthread_cond_timedwait阻塞失败,或者说࿰…

c/c :linux时间函数以及基本概念

c/c:linux时间函数以及基本概念 1秒(s)10^3毫秒(ms); 1毫秒(ms)10^3微秒(us); 1微秒(us)10^3纳秒(nsÿ…
网站地图