返回一个在函数内部填充的constchar*向量是定义良好的行为吗
Is it well-defined behavior to return a vector of const char*, filled inside a function
我目前正在学习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!";
->好,如果它是在static
或extern
作用域中声明的
-->gt;BAD,如果此数组在函数中声明为非静态数组。 -
char* SOMESTRING = new char[X]; strncpy(SOMESTRING, "Hello World!", N);
->好的,因为字符串的存储现在是在空闲存储(即堆)&将保持不变,直到删除为止。问题是,存储在vector
中的字符串必须稍后释放,以防止内存泄漏。
BTW,std::vector
不影响行为的定义/不确定性;在这种情况下,它只依赖于如上所述的C样式字符串文字。
相关文章:
- 自己的自定义向量类. 内存重新分配
- C++类中的类作为自定义向量(如何初始化?
- 在C++中使用带有自定义向量的迭代器
- 创建自定义向量类错误
- 如何在<typename> <long> 不更改给定代码的情况下将自定义向量与 STL 向量相互转换?
- 如何为我的自定义向量类实现类似 vector.insert 的方法
- 如何在没有参数列表的情况下定义向量无效使用模板名称 std::vector
- 将 boost odeint 与 std::map 和自定义向量空间代数一起使用时,没有可行的重载'='
- Push_back类定义向量的函数
- 自定义向量类的解构函数
- c++在单独的函数中定义向量
- 定义向量元素的破坏顺序是否合理
- vector.erase 和 std::remove 在自定义向量上
- 在自定义类中定义向量
- C++11 initializer_list构造函数,带有自定义向量类的头和cpp文件
- 如何在<ifstream> C++ 类中定义向量
- 为自定义向量类中的特定元素指定一个值.作为a[5]=3 C++
- 重载自定义向量类中的和运算符
- 如何在C++中定义向量<boost::mutex>?
- 在自定义向量类中调用了错误的构造函数