gpt4 book ai didi

c++ - 这会使用局部变量破坏堆栈吗?

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

我类有一个成员

std::vector<std::pair<std::string, std::string> > mEnvironment;

现在我编写了一个函数,将此 vector 作为键/值对加载到过程环境中。我不需要访问成员,所以我不使用 map ,并且认为 vector 会更好,因为我只对其进行迭代。

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) 会发生什么。我放入 vector 中的对象会持续存在,还是会调用析构函数?或者更糟糕的是,它会被简单地覆盖还是我必须在循环中创建一个新的对对象?

最佳答案

不会有任何不好的事情发生,因为 vector 会复制该对(以及其中的两个字符串中的每一个)。

为了支持这一点,以下是标准(C++11,§23.2.3,在正式版第 738 页的大表格中)的相关引用:

a.push_back(t) [...] Appends a copy of t // Requires: T shall be CopyInsertable into X.

在这里,X代表 vector 类型,t对于 T 类型的左值或常量右值, 这是成员元素的类型。所以这适用于你的情况。 (如果这对是动态创建的,即在 push_back(...) 函数调用中,您将有一个临时右值,这意味着将应用不同的表行并且您将获得移动而不是拷贝,但是仍然不会有任何问题。)

vector 存储其元素的拷贝。 (当你有一个元素类型被定义为指针类型的 vector ,或者一些具有指针成员的结构或类时,唯一的危险存在。当然, vector 然后只复制指针,而不是内容的深层拷贝; 或者在结构或类类型的情况下,它会按照该数据类型的复制构造函数定义的方式进行复制。但是对于 std::pairstd::string ,一切都会按预期工作。)

关于c++ - 这会使用局部变量破坏堆栈吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17260388/

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