返回一个在函数内部填充的constchar*向量是定义良好的行为吗

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

本文关键字:定义 向量 constchar 返回 一个 填充 内部 函数      更新时间:2023-10-16

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

#define SOMESTRING "Hello World!"
std::vector<const char*> buildVector() {
std::vector<const char*> vec;
vec.push_back(SOMESTRING);
return vec;
}

当我看到这一点时,我想知道:这是定义的行为吗?字符串"Hello World!"的内容不是位于堆栈上吗?因此,一旦函数返回,它就无效了?如果这是未定义的行为,那么正确的方法是什么?遗憾的是,由于存在vulkan API,使用std::string不是一个选项。

,因为SOMESTRING的作用域(即该宏表示的值)属于静态存储,即字符串文字在程序执行的整个生命周期内。这就是你的情况。


以下是各种场景:

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

  • const char* SOMESTRING = "Hello World!"
    ->好的,和上面一样。

  • char SOMESTRING[] = "Hello World!";
    ->好,如果它是在staticextern作用域中声明的
    -->gt;BAD,如果此数组在函数中声明为非静态数组。

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

BTW,std::vector不影响行为的定义/不确定性;在这种情况下,它只依赖于如上所述的C样式字符串文字。