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!";
--> 好的,如果它是在 static
或 extern
范围内声明的。
--> 错误,如果此数组在函数中声明为 non-static.
char* SOMESTRING = new char[X]; strncpy(SOMESTRING, "Hello World!", N);
--> 好的,因为字符串的存储现在在空闲存储区(即堆)中并且将一直保持到它被删除。问题是,存储在 vector
中的字符串必须稍后释放以防止内存泄漏。
顺便说一句,std::vector
不会影响行为的 define/undefine-ness;在这种情况下,它仅取决于 C-style 字符串文字,如上所示。
我目前正在学习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!";
--> 好的,如果它是在static
或extern
范围内声明的。
--> 错误,如果此数组在函数中声明为 non-static.char* SOMESTRING = new char[X]; strncpy(SOMESTRING, "Hello World!", N);
--> 好的,因为字符串的存储现在在空闲存储区(即堆)中并且将一直保持到它被删除。问题是,存储在vector
中的字符串必须稍后释放以防止内存泄漏。
顺便说一句,std::vector
不会影响行为的 define/undefine-ness;在这种情况下,它仅取决于 C-style 字符串文字,如上所示。