我目前正在学习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!”;
– 好的,如果声明它是在静态或外部范围内声明的.
– 如果在函数内声明此数组,则为BAD.
> char * SOMESTRING = new char [X]; strncpy(SOMESTRING,“Hello World!”,N);
– 好的,因为字符串的存储现在处于免费存储(即堆)和将一直保留,直到删除.问题是,字符串
存储在向量中必须释放,以防止内存泄漏.
BTW,std :: vector不会影响行为的定义/取消定义.这里它仅取决于所引用的c字符串,如上所述.