首页 > 解决方案 > 为什么 make_unique to vector::back() 创建另一个副本?

问题描述

在这里复制一个简单的例子来演示我的问题

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <memory>

struct Party {
    Party(std::string value) : value_(value) {};
    std::string value_;
};

int main() {
    std::unordered_map<std::string, std::unique_ptr<Party>> map_;
    std::vector<Party> parties_;

    parties_.emplace_back("AAA");
    parties_.emplace_back("BBB");
    parties_.emplace_back("CCC");

    std::unique_ptr<Party> ptr = std::make_unique<Party>(parties_.back());

    ptr->value_ = "XXX";

    for (auto& p : parties_) {
        std::cout << p.value_ << std::endl; // print: AAA\nBBB\nCCC
    }

}

本质上,我想将对象存储在向量中,并让智能指针指向它们,并使用这些指针来修改向量对象的值。

但似乎在制作 newunique_ptr时,parties_.back()实际上返回了对象的副本而不是原始对象。

我如何在这里实现我想要的?谢谢!

标签: c++pointersvector

解决方案


std::make_unique<Party>(parties_.back())总是创建一个对象。它是std::unique_ptr<Party>(new Party(parties_.back())). 请注意,parties_.back()它本身并没有复制任何东西,它返回一个引用。

在你的代码ptr中不需要拥有Party它的指向:parties_已经是拥有者。只需使用引用或原始指针:

Party &lastParty = parties_.back();
lastParty.value_ = "XXX";

推荐阅读