c++ - 返回填充在函数内部的 const char* vector 是否是明确定义的行为

标签 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

最佳答案

,因为 SOMESTRING 的范围(即由该宏表示的值)属于 static storage ,即字符串文字具有程序执行的完整生命周期。这就是您的情况。


以下是各种场景:

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

  • const char* SOMESTRING = "Hello World!"
    --> 好的。同上。

  • char SOMESTRING[] = "Hello World!";
    --> 好的,如果它是在 staticextern 范围内声明的。
    --> 错误,如果此数组在函数中声明为非静态。

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

顺便说一句,std::vector 不会影响行为的定义/未定义;在这种情况下,它仅取决于如上所示的 C 风格字符串文字。

关于c++ - 返回填充在函数内部的 const char* vector 是否是明确定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41663692/

相关文章:

c++ - 卸载 DLL 时与时间相关的崩溃?

c++ - 用常量值填充 std::vector<double>

c++ - 将对象移动到 std::vector 时的异常保证

c++ - cStrings 删除非字母/非空格字符 - C++

c - 为什么在写入使用字符串初始化的 "char *s"时会出现段错误,而不是 "char s[]"?

c++ - 使用文件初始化静态成员

c++ - 需要有关 C++ 类引用的建议

c++ - 这不是 const auto& 多余的吗?

c++ - vector 超出范围而不给出错误

c++ - 将 MFC 的 CString 转换为 ASCII 和 UNICODE 的 int