这会使用局部变量破坏堆栈吗
Would this corrupt the stack using a local variable?
在我的班级里,我有一个成员
std::vector<std::pair<std::string, std::string> > mEnvironment;
现在我编写了一个函数,它将这个向量与进程环境作为键/值对加载。我不需要访问成员,所以我不使用地图,并认为矢量会更好,因为我只迭代它。
void Environment::setEnvironment(char const *oEnvironment[])
{
mEnvironment.clear();
if(oEnvironment == NULL)
return;
std::string name;
std::string value;
std::pair<std::string, std::string> entry;
for(const char **envp = oEnvironment; *envp != NULL; envp++)
{
const char *env = *envp;
name.clear();
value.clear();
for(env = *envp; *env != 0; env++)
{
if(*env == '=')
{
env++;
break;
}
name += *env;
}
value = env;
entry = std::make_pair(name, value);
mEnvironment.push_back(entry);
}
}
由于变量entry
是局部的,我想知道当函数超出范围时,push_back(entry)
会发生什么。我放入向量中的对象会持久存在吗,还是会调用析构函数?或者更糟的是,它会被简单地覆盖吗?还是我必须在循环中创建一个新的pair对象?
不会发生任何错误,因为向量会复制对(以及其中的两个字符串中的每一个)。
为了支持这一点,以下是标准的相关引用(C++11,§23.2.3,在官方版本第738页的大表中):
a.push_back(t)
[…]附加一份t
//要求:T
应为CopyInsertable
到X
中。
这里,X
代表向量类型,t
代表类型为T
的左值或常右值,这是成员元素的类型。所以这适用于你的情况。(如果该对是动态创建的,即在push_back(...)
函数调用中,您将有一个临时的右值,这意味着将应用不同的表行,您将获得一个移动而不是副本,但仍然不会有任何问题。)
矢量存储其元素的副本。(当你有一个向量的元素类型被定义为指针类型,或者某个结构或类有指针成员时,唯一的危险就存在了。然后,向量当然只复制指针,而不是内容的深层副本;或者,在结构或类类型的情况下,它复制该数据类型的复制构造函数定义的副本。但对于std::string
的std::pair
k。)
相关文章:
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 从函数返回变量地址时如何修复"与局部变量关联的堆栈内存地址"?
- 为什么堆栈中的函数局部变量之间存在内存空间
- 函数调用时局部变量在堆栈中的组织方式
- 返回的与局部变量关联的堆栈内存的地址 (C++)
- 局部变量堆栈
- 为什么为堆栈中的局部变量分配的内存多于C++中所需的内存
- 函数的局部变量是如何从堆栈中访问的
- 正在检查堆栈中的局部变量
- 这会使用局部变量破坏堆栈吗
- 局部变量(大数组)的初始化如何影响堆栈大小
- 是为堆栈局部数组创建的指针变量
- 通过创建局部变量减少堆栈指针
- 局部变量的堆栈溢出