按unique_pointer将传递的对象存储在地图中

Storing passed objects in map by unique_pointer

本文关键字:存储 对象 地图 unique pointer      更新时间:2023-10-16

我在大学的 c++ 项目中遇到了以下问题:
我想使用映射存储 Class1 的一些对象。 由于我的项目设计,将地图保存为成员变量的类不会创建要存储在地图中的对象。我在这个论坛上的研究告诉我使用unique_ptr来传递这些对象。

在实验测试项目中结合这两个想法时:

#include <iostream>
#include <memory>
#include <unordered_map>
typedef std::unique_ptr<std::string> string_ptr;
class Class1 {
public:
std::unordered_map<std::string, string_ptr> my_unordered_map;
Class1() : my_unordered_map(){
}
void addTo(string_ptr ptr) {
std::string string = *ptr;
std::cout << string << std::endl;
my_unordered_map[0] = std::move(ptr);
}
};

int main() {
std::cout << "Process started!"<< std::endl;
string_ptr ptr;
ptr = std::make_unique<std::string>("text");
Class1 cont;
cont.addTo(std::move(ptr));

}

它编译,但抛出一个

抛出 'std::logic_error'what
(( 的实例后调用的终止:basic_string::_M_construct null 无效

在运行时。

我还尝试按照其他帖子中的建议将void addTo(string_ptr ptr(更改为addTo(string_ptr &ptr(,但问题仍然存在。

现在,问题出在哪里?是不是:
a(不让Class1自己创建对象是一个设计错误。在这种情况下,C++在地图中插入unique_ptr可以回答我的问题。
--或-
b(我对c ++的小知识让我错过了什么?

旁注:ofc 我想存储在这些指针中的对象不是字符串。

你的问题与unique_ptr无关。它与您的值对象完全无关。它实际上是用你的钥匙。遗憾的是,整数文字 0(并且只有 0,而不是值为 0 的 int 变量(可以被视为任何类型的指针。同样不幸的是,std::string有一个来自char const*的隐式转换构造函数。因此,当您执行此操作时:

my_unordered_map[0] = std::move(ptr);

由于您的密钥类型是std::string,因此您正在从空指针隐式构造一个std::string。那是你的错误。

这里

my_unordered_map[0] = std::move(ptr);

您将int作为密钥传递,但my_unordered_map期望std::string作为密钥,解决方案:

my_unordered_map[string] = std::move(ptr);

在抛出"std::logic_error"实例后终止调用 what((: basic_string::_M_construct 空

无效

std::string具有来自char const*的隐式转换构造函数,这意味着尝试从 NULL 指针构造std::string,导致此错误的原因。

如果需要空字符串,请执行以下操作

my_unordered_map[std::string("")] = std::move(ptr);