这会使用局部变量破坏堆栈吗

Would this corrupt the stack using a local variable?

本文关键字:堆栈 局部变量      更新时间:2023-10-16

在我的班级里,我有一个成员

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应为CopyInsertableX中。

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

矢量存储其元素的副本。(当你有一个向量的元素类型被定义为指针类型,或者某个结构或类有指针成员时,唯一的危险就存在了。然后,向量当然只复制指针,而不是内容的深层副本;或者,在结构或类类型的情况下,它复制该数据类型的复制构造函数定义的副本。但对于std::stringstd::pairk。)