C++ 从模板化队列检索时的核心转储 背景
我想要一个类C++ 从模板化队列检索时的核心转储 背景,c++,templates,c++14,unique-ptr,coredump,C++,Templates,C++14,Unique Ptr,Coredump,我想要一个类MyClass,它存储不同类型的队列。为此,我创建了一个接口ValueInterface和一个派生类Value。现在,我可以使用queue成员变量将此派生类的实例存储在MyClass中 注意:出于我自己的目的,我特意尝试保持MyClass非模板化,并且我希望依赖模板化函数 目标 我有下面编译的代码,但是在下面的测试代码中运行会导致内核转储。我认为我在使用std::unique_ptr时很小心,并确保尽可能使用std::move。GetValueAndAdvance函数导致错误。当我试
MyClass
,它存储不同类型的队列。为此,我创建了一个接口ValueInterface
和一个派生类Value
。现在,我可以使用queue
成员变量将此派生类的实例存储在MyClass
中
注意:出于我自己的目的,我特意尝试保持MyClass
非模板化,并且我希望依赖模板化函数
目标
我有下面编译的代码,但是在下面的测试代码中运行会导致内核转储。我认为我在使用std::unique_ptr
时很小心,并确保尽可能使用std::move
。GetValueAndAdvance
函数导致错误。当我试图从模板队列中检索时,出现了一些问题。我知道这很混乱,我假设静态\u cast
可以工作,但是如何才能从std::queue
(存储ValueInterface
)中检索值呢?
我不知道问题是否出在StoreValue
或GetValueAndAdvance
中,或者整个设计是否有缺陷,在类型敏感语言中不可能实现
测试中的用法:
这就是我想要实现的功能。这是假设每个MyClass
一次只用于一种类型。因此,假设没有人会在同一个MyClass
对象上调用StoreValue(4)
和StoreValue(“hello”)
。但出于我自己的原因,我想保持MyClass
非模板化
MyClass my_class;
my_class.StoreValue<int>(5);
int val;
my_class.GetValueAndAdvance<int>(&val);
std::cout << "value: " << val; // Should print "value: 5"
MyClass我的班级;
my_class.StoreValue(5);
int-val;
my_class.GetValueAndAdvance(&val);
std::cout问题在值
类中,其中值
被定义为对常量值的引用
const T& value_;
将值定义为正常(非参考)值
您应该从std::cout
获得5
观察值的构造函数
value\uu
引用是用一个临时变量(val
)初始化的,该变量在构造函数末尾超出范围
因此value\uuuu
被绑定到一个可以重用的内存,因此有未定义的值。很抱歉,这并没有解决问题:(如上所述,我更新了帖子以包含我的错误消息片段。@user3445268-可能还有另一个问题,但这是一个问题(删除引用,用我的编译器打印5
);您应该为我们提供一个最小但完整且可编译的示例,以允许我们重现问题。嗨@max66,我已经完成了调查,发现我的编译器比您的编译器更挑剔。在运行时,它不知道要删除多大的对象,因为我最初只有一个ValueInterface
对象。修复方法是添加ValueInterface类中的虚拟析构函数,并在Value
中重写它。不过,从Value中删除引用也修复了我的代码。
F0418 18:08:57.928949 244111 debugallocation.cc:763] RAW: delete size mismatch: passed size 1 != true size 4
@ 0x7fda024f8a1f (anonymous namespace)::RawLogVA()
@ 0x7fda024f8525 base_raw_logging::RawLog()
@ 0x42b162 tc_delete_sized
@ 0x40c595 std::default_delete<>::operator()()
@ 0x40c503 std::unique_ptr<>::~unique_ptr()
@ 0x40b552 mynamespace::MyClass::GetValueAndAdvance<>()
const T& value_;
const T value_;
Value(T val) : value_(val){};