按unique_pointer将传递的对象存储在地图中
Storing passed objects in map by unique_pointer
我在大学的 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);
- 如何使用 stl 容器有效地存储对象?(即根据其字段的值进行搜索)
- 线程上下文上的静态存储对象优化
- OOP - 存储对象和服务接口
- 为什么存储对象地址在缓冲区中会导致内存泄漏并删除它们
- 是否保证在销毁所有线程本地存储对象后销毁全局对象
- 使用列表存储对象
- 在c++中存储一个对象或不存储对象的首选方式是什么
- 更好的是:存储对象与存储指针
- 应用程序使用QMAP存储对象时停止响应
- 使用堆栈存储对象
- 如何在 std::map 中存储"对象类型"?
- 我应该如何存储对象
- 在 c++ 中存储对象的最佳策略是什么,确保名称唯一并能够在以后有效地检索它们
- 用于存储对象列表的最佳标准类
- 在C++中存储对象地址的数据结构
- 函子如何维护/存储对象的状态
- 我如何定义一个向量,并用C++在其中存储对象
- 存储对象以备将来使用(在重新启动程序时)
- C++/JNI-存储对象(jobject)在向量和数组中发生意外更改,C++或JNI问题
- 在多个容器中存储对象的最佳实践