android - 将 String8 转换为 const char*

标签 android c++

压力测试中有一个非常奇怪的问题。该问题无法 100% 重现,因此我使用了以下代码并成功重现了它:

269 >---String16 test1 = String16("0");
270 >---String16 test2 = String16("0");
271 >---String16 test3 = String16("1");
272 >---String16 test4 = String16("1");
273 >---String16 test5 = String16("12");
274 >---String8 test6  = String8("12");
275 >---const char* s1 = String8(test1).string();
276 >---PLOGI("s1: %s", s1);
277 >---const char* s2 = String8(test2);
278 >---PLOGI("s2: %s", s2);
279 >---const char* s3 = String8(test3).string();
280 >---PLOGI("s3: %s", s3);
281 >---const char* s4 = String8(test4);
282 >---PLOGI("s4: %s", s4);
283 >---const char* s5 = String8(test5);
284 >---PLOGI("s5: %s", s5);
285 >---const char* s6 = test6;
286 >---PLOGI("s6: %s", s6);

大部分日志输出都符合预期:

2432 I/PHService(  127): s1: 0
2433 I/PHService(  127): s2: 0
2434 I/PHService(  127): s3: 1
2435 I/PHService(  127): s4: 1
2436 I/PHService(  127): s5: 12
2437 I/PHService(  127): s6: 12

但很少有像这样的:

2458 I/PHService(  127): s1: ^X
2459 I/PHService(  127): s2: ^X
2460 I/PHService(  127): s3: ^X
2461 I/PHService(  127): s4: ^X
2462 I/PHService(  127): s5: ^X
2463 I/PHService(  127): s6: 12

好像转换后的数据损坏了(^X是损坏的数据),但它只发生在String8(Strng16)上,而没有发生在String8()上。我不确定这是怎么发生的。我用了运算符

String8::operator const char*() const

它也应该适用于 String8(Strng16)。

最佳答案

s1, s2,... s5 的初始值设定项中,您创建类型为 String8 的临时对象.它们中的每一个都是短暂的,并且在对创建它的整个表达式求值结束时被销毁。

因此,当您检查指向的数据的下一行时,指针可能指向一些已经释放的内存 - 并且可能会被重用。

String8() 很可能是通过将字符串指针设置为静态空字符串缓冲区来实现的,因此没有要释放的内存。

关于android - 将 String8 转换为 const char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22527711/

相关文章:

android - 如何在android中从手势输入中写入和读取文本?

android - 如何让 Android SeekBar 的拇指与 SeekBar 的高度相匹配?

android - 如何在 notifyChange 后更改 Loader<Cursor> 中的查询

c++ - 使用指针引用传递特定的数组元素

c++ - ofstream 无法在 Linux 上运行

c++ - 对 `JNI_CreateJavaVM' linux 的 undefined reference

java - 如何在它被杀死后检查进程状态,或者这甚至可能吗?

android - 在 Android 中滑动解锁动画

c++ - 在另一个类的声明中将参数传递给类构造函数

c++ - 为 boost::property_maps 中的枚举专门化 boost::lexical_cast