gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:53 25 4
gpt4 key购买 nike

我目前正在学习 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com