gpt4 book ai didi

c++ - 将 unique_ptr 插入 map ,指针被销毁

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

我有以下(简化的)类(class):

class Operator {
private:
std::map<std::string, std::unique_ptr<Operand>> op;

public:
template <class T>
void insertOperand(std::string const &s, T o = T()) {
op.insert(std::pair<std::string, std::unique_ptr<StreamOperand>>(
s, std::move(std::unique_ptr<T>(new T(o)))
);
}

void setOperandsValue(std::string const &o, int v) {
op.find(o)->second->setValue(v);
}
};

插入一个新的 Operand 没有任何问题。然而,当函数返回时,析构函数被调用,因此 map 在调用 setOperandsValue 时不包含任何对象。我使用 DDD 观察到这一点:在 insertOperand 的末尾调用了 Operator::~Operator()

看了Using std::unique_ptr with STL之后,我介绍了(更好:已使用)std::move 但要么它没有正确放置,要么我遗漏了一些东西(很可能是由于缺乏知识)。我没有使用 map::emplace,因为它不可用。

编辑: 析构函数调用是有效的,因为它正在破坏 new T(o)。无论如何,当输入 setOperandsValue 时,map 仍然是空的。

编辑 #2: 在输入 setOperandsValue 并执行 op.find(o) 时,结果是 op.end,即虽然我之前添加过,但找不到条目。

最佳答案

我不认为你的指针被破坏了。您在这里看到的内容:

template <class T>
void insertOperand(std::string &s, T o = T()) {
op.insert(std::pair<std::string, std::unique_ptr<StreamOperand>>(
s, std::move(std::unique_ptr<T>(new T(o)))
);
}

o 的销毁,在它被用于构造 unique_ptr 中使用的堆分配 T 之后。

map 为空并不是指针被破坏的征兆。如果是这种情况(指针被销毁),您将在映射中为给定键创建一个条目,其中包含一个无效的 unique_ptr。

关于c++ - 将 unique_ptr 插入 map ,指针被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10579953/

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