我目前正在学习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
不是一种选择。
答案 0 :(得分:2)
是,因为SOMESTRING
的范围属于静态存储,即字符串文字具有程序执行的完整生命周期。这是你的情况。
以下是各种情况:
#define SOMESTRING "Hello World!"
const char* SOMESTRING = "Hello World!"
char SOMESTRING[] = "Hello World!";
char* SOMESTRING = new char[X]; strncpy(SOMESTRING, "Hello World!", N);
vector
中的必须释放,以防止内存泄漏。 BTW,std::vector
不会影响行为的定义/取消定义。这里仅取决于所引用的c字符串,如上所示。