return 一个 const char* 的向量,在一个函数中填充,它是定义明确的行为吗

Is it well-defined behavior to return a vector of const char*, filled inside a function

我目前正在学习vulkan。在其中一个教程中,我看到了一个大致执行以下操作的函数:

#define SOMESTRING "Hello World!"

std::vector<const char*> buildVector() {
    std::vector<const char*> vec;
    vec.push_back(SOMESTRING);
    return vec;
}

当我看到这个时,我想知道:这是定义的行为吗?字符串"Hello World!"的内容不是位于栈中,一旦函数returns就无效了吗?如果这是未定义的行为,那么正确的方法是什么?不幸的是,使用 std::string 不是一个选项,因为 vulkan API.

,因为SOMESTRING的范围(即那个宏表示的值)属于static storage,即字符串字面量的完整生命周期为程序执行。这就是你的情况。


以下是各种场景:

  • #define SOMESTRING "Hello World!"
    --> 好的。字符串文字存储在静态存储中,因此它们的生命周期是从程序开始到结束

  • const char* SOMESTRING = "Hello World!"
    --> 好的。同上

  • char SOMESTRING[] = "Hello World!";
    --> 好的,如果它是在 staticextern 范围内声明的。
    --> 错误,如果此数组在函数中声明为 non-static.

  • char* SOMESTRING = new char[X]; strncpy(SOMESTRING, "Hello World!", N);
    --> 好的,因为字符串的存储现在在空闲存储区(即堆)中并且将一直保持到它被删除。问题是,存储在 vector 中的字符串必须稍后释放以防止内存泄漏。

顺便说一句,std::vector 不会影响行为的 define/undefine-ness;在这种情况下,它仅取决于 C-style 字符串文字,如上所示。