只要进程处于活动状态,const char* 字符串就会持久存在吗?

问题描述 投票:0回答:2

我有类似以下的功能:

const char* get_message() {
    return "This is a constant message, will NOT change forever!";
};

const char* get_message2() {
    return "message2";
};

我计划在我的应用程序的任何地方使用它们,即使在不同的线程中。

我想知道这些字符串的生命周期,即在 func get_message* 之外使用这些

const char*
字符串是否安全。

我猜想硬编码的

const char*
字符串将被编译到应用程序的代码段而不是数据段中,所以也许像上面那样使用它们是安全的?

对不起我的英语不好!

c++ constants constexpr lifetime null-terminated
2个回答
3
投票

是的,这样做是安全的。你的假设是正确的。


0
投票

让我们看看代码中 gdb

发生了什么

我们在函数中放置断点,返回指向常量字符串的指针:

我们在进程地址映射中看到地址 0x555555556004 已在部分

0x555555556000     0x555555557000     0x1000     0x2000  r--p   /home/drazen/proba/main

因此该部分不可执行且不可写,仅可读。

当我们检查 wid readelf 时,它显示它位于 ELF 文件的 .rodata 部分:

drazen@HP-ProBook-640G1:~/proba$ readelf  -x .rodata main

Hex dump of section '.rodata':
0x00002000 01000200 6d657373 61676532 00       ....message2.

所以答案是它不会在 ELF 文件的代码段 .text 中,而是在 rodata

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.