4

在我的班上,我有一个成员

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 对象?

4

1 回答 1

2

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

为了支持这一点,这里是来自标准的相关引用(C++11,§23.2.3,在官方版第 738 页的大表中):

a.push_back(t)t[...] 附加// Requires: T shall be CopyInsertableinto的副本X

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

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

于 2013-06-23T11:43:03.663 回答