Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从模板化队列检索时的核心转储 背景_C++_Templates_C++14_Unique Ptr_Coredump - Fatal编程技术网

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){};