返回const char *的向量是否是定义良好的行为,填充在函数内部

时间:2017-01-15 16:52:21

标签: c++ stdvector c-strings

我目前正在学习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不是一种选择。

1 个答案:

答案 0 :(得分:2)

,因为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);
    - 好的,因为字符串的存储现在处于免费存储(即堆)和将一直保留,直到删除。问题是,字符串 存储在vector中的必须释放,以防止内存泄漏。

BTW,std::vector不会影响行为的定义/取消定义。这里仅取决于所引用的c字符串,如上所示。