C++ c++;/映射中的元素通过退出函数而神秘地消失

C++ c++;/映射中的元素通过退出函数而神秘地消失,c++,function,class,dictionary,unique-ptr,C++,Function,Class,Dictionary,Unique Ptr,我的地图代码有问题,我会尽力解释的 我的代码:(我简化了代码,只保留导致问题的部分) [程序cpp] #包括 #包括 #包括 #包括 //此hpp文件包括我的所有其他hpp文件,我检查了依赖项,所有这些都可以 #包括“dolmen.hpp” int main(int argc,char const*argv[]{ //创建dolmen元素 多尔曼:多尔曼多尔曼; //读取数据 标准:ifstream trame(“trame.txt”); std::of流{“report.csv”}; std

我的地图代码有问题,我会尽力解释的

我的代码:(我简化了代码,只保留导致问题的部分)

[程序cpp]


#包括
#包括
#包括
#包括
//此hpp文件包括我的所有其他hpp文件,我检查了依赖项,所有这些都可以
#包括“dolmen.hpp”
int main(int argc,char const*argv[]{
//创建dolmen元素
多尔曼:多尔曼多尔曼;
//读取数据
标准:ifstream trame(“trame.txt”);
std::of流{“report.csv”};
std::stringdatatxt;
//std::map sensorList=dolmen::initialise();
//std::map sensorList=std::map();
//创建工厂元素
/*使用Factory=dolmen::FactorySensor;
工厂*/
//创建地图以存储所有传感器
地图传感器列表;
//std::map sensorList=std::map();
初始化(传感器列表);
//我要简化传感器方法的调用
[抓取我的传感器x列表中的传感器]
x->getID();
//我的x不存在
[sensorInit.hpp]

\ifndef-DOLMEN\u传感器\u初始\u水电站
#定义DOLMEN_传感器_初始_水电站1
/*DolMen用户只需在需要添加新传感器时修改此文件*/
#包括“factorySensor.hpp”
#包括“sensor.hpp”
//在此插入您的传感器hpp文件
#包括“温度.hpp”
#包括“陀螺仪.hpp”
#包括“加速度.hpp”
#包括“海拔高度.hpp”
#包括“gps.hpp”
#包括“压力.hpp”
名称空间多尔曼
{
//使用工厂=工厂传感器秒;
}
//搜索传感器返回的最大数据数
//(有些传感器可以返回一个值,有些传感器可以返回多个值)
int max=0;
if(elem->getID()==id)
{
//使用正确的传感器解码数据,从我们的数据帧创建包含传感器所有数据的地图
elem->解码(数据);//通过将id与数据帧id匹配,在传感器列表中找到正确的传感器
//多尔曼:传感器*元件;
std::唯一的ptr元素;
if(auto it=sensorList.find(id);it!=sensorList.end())
{
elem=it->second;
}
//搜索传感器返回的最大数据数
//(有些传感器可以返回一个值,有些传感器可以返回多个值)
int max=0;
if(elem->getID()==id)
{
//使用正确的传感器解码数据,从我们的数据帧创建包含传感器所有数据的地图
元素->解码(数据);
如果(abs(int(elem->getValue().size())/elem->getNbAttr())>max)
{
max=int(elem->getValue().size());
}
}
其他的
{
std::cout getValue().size())/elem->getNbAttr())>max)
{
max=int(elem->getValue().size());
}
}
其他的
{
std::cout;
//此文件用于创建所有新传感器,用户只需修改此文件
内嵌无效初始化(标准::映射和传感器列表)
{
//创建工厂元素
使用工厂=工厂传感器;
工厂;
/*//创建地图以存储所有传感器
std::map sensorList=std::map()*/
//---换乘---
//这是指向传感器元件的指针,用于将传感器从工厂移动到我们的地图
传感器*传感器=零PTR;
//ksp项目使用:00时间/01温度/02压力/03加速度/04 gps/05高度/06陀螺仪
//我只为测试创建了一个传感器,但我可以创建多个传感器
//创建温度传感器
注册表(“温度传感器”[](int arg1,std::string arg2){return std::make_unique(arg1,arg2);});
标准::唯一温度=工厂。创建(“温度传感器”,01,“温度”);
传感器=温度。获取();
insert(std::make_pair(sensor->getID(),std::move(temperature));
//这部分工作完美,我可以看到我所有的传感器,调用方法,没有问题
用于(常量自动和元素:传感器列表)
{
std::这是我的旧版本吗,直到我的传感器列表使用unique_ptr而不是*
std::唯一的ptr元素;
if(auto it=sensorList.find(id);it!=sensorList.end())
{
elem=it->second;//问题就在这里
}
//搜索传感器返回的最大数据数
//(有些传感器可以返回一个值,有些传感器可以返回多个值)
int max=0;
if(elem->getID()==id)
{
//使用正确的传感器解码数据,从我们的数据帧创建包含传感器所有数据的地图
元素->解码(数据);
如果(abs(int(elem->getValue().size())/elem->getNbAttr())>max)
{
max=int(elem->getValue().size());
}
}
其他的
{

std::cout您需要在地图中保持
的唯一性,下面是一个简化版本,说明您需要做什么才能使其正常工作:

#include <iostream>
#include <memory>
#include <map>

void initialise(std::map<int, std::unique_ptr<int>>& map) {
    for(auto i = 0; i < 10; ++i) {
        auto newObject = std::make_unique<int>(i);
        map[i] = std::move(newObject);
    }
}

int main() {
    std::map<int, std::unique_ptr<int>> map;
    initialise(map);

    for(const auto& e : map) {
        std::cout << *(e.second) << std::endl;
    }

    return 0;
}
#包括
#包括
#包括
无效初始化(标准::映射和映射){
用于(自动i=0;i<10;++i){
auto newObject=std::make_unique(i);
map[i]=std::move(newObject);
}
}
int main(){
地图;
初始化(地图);
用于(const auto&e:map){

你的理论是正确的吗?要么不要使用unique\u ptr,要么(可能更好)始终如一地使用它,将您的映射更改为
std::map
,这样我就有了:
std::map
而不是
std::map
?我刚刚尝试了它…我得到了一条非常混乱的错误消息:
/usr/include/c++/9/ext/new_分配器。h:145:20:错误:使用了删除的函数“constepr std::pair::pair”(const std::pair&)[with the_T1=const int;_T2=std::unique_ptr]'145|noexcept(::new((void*)noexcept)^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 146|Up(std::forward(u args))~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~编译因-Wfatal错误而终止。make:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(我只粘贴最后一部分)没有。我建议编辑您尝试过的内容