[英]What causes delete size mismatch?
Why does this code 为什么这样的代码
#include <functional>
#include <iostream>
#include <memory>
struct Result {
string value;
};
class BaseHandler {
public:
BaseHandler() {}
void Handle() { std::cout << "Base Handler " << endl; }
~BaseHandler() {}
};
class Handler : public BaseHandler {
public:
Handler(const Result& result) : result_(result) {}
void Handle() { std::cout << "Result: " << result_.value << endl; }
~Handler() {}
private:
Result result_;
};
class Dispatcher {
public:
void Dispatch() {
std::unique_ptr<BaseHandler> handler = create_handler_();
handler->Handle();
}
std::function<std::unique_ptr<BaseHandler>()> create_handler_;
};
void SetHandler(Dispatcher* dispatcher, Result some_result) {
dispatcher->create_handler_ =
[some_result]() -> std::unique_ptr<BaseHandler> {
std::unique_ptr<BaseHandler> handler(new Handler(some_result));
return handler;
};
}
int main(int argc, char** argv) {
Result some_result;
some_result.value = "some_value";
Dispatcher dispatcher;
SetHandler(&dispatcher, some_result);
dispatcher.Dispatch();
return 0;
}
Produce the error 产生错误
F0731 11:28:05.092886 61642 debugallocation.cc:762] RAW: delete size mismatch: passed size 1 != true size 32
@ 0x49f053 (anonymous namespace)::RawLogVA()
@ 0x49ec05 base_raw_logging::RawLog()
@ 0x56d51b tc_delete_sized
@ 0x40e65b std::default_delete<>::operator()()
@ 0x40e513 std::unique_ptr<>::~unique_ptr()
@ 0x40da86 Dispatcher::Dispatch()
@ 0x40d527 main
@ 0x7f393a983ce8 __libc_start_main
@ 0x40cef9 _start
*** SIGABRT received by PID 61642 (TID 61642) from PID 61642; ***
Aborted (core dumped)
The problem is the destructor of BaseHandler and Handler aren't declared virtual. 问题是BaseHandler和Handler的析构函数未声明为虚拟。
If Handle had been marked as virtual in BaseHandler and override in Handler then the compiler would have generated an error about the destructor not being declared virtual. 如果Handle在BaseHandler中被标记为虚拟,并在Handler中被覆盖,则编译器将生成有关析构函数未声明为虚拟的错误。
The code below works as expected. 下面的代码按预期方式工作。
#include <functional>
#include <iostream>
#include <memory>
struct Result {
string value;
};
class BaseHandler {
public:
BaseHandler() {}
virtual void Handle() { std::cout << "Base Handler " << endl; }
virtual ~BaseHandler() {}
};
class Handler : public BaseHandler {
public:
Handler(const Result& result) : result_(result) {}
void Handle() override { std::cout << "Result: " << result_.value << endl; }
virtual ~Handler() {}
private:
Result result_;
};
class Dispatcher {
public:
void Dispatch() {
std::unique_ptr<BaseHandler> handler = create_handler_();
handler->Handle();
}
std::function<std::unique_ptr<BaseHandler>()> create_handler_;
};
void SetHandler(Dispatcher* dispatcher, Result some_result) {
dispatcher->create_handler_ =
[some_result]() -> std::unique_ptr<BaseHandler> {
std::unique_ptr<BaseHandler> handler(new Handler(some_result));
return handler;
};
}
int main(int argc, char** argv) {
Result some_result;
some_result.value = "some_value";
Dispatcher dispatcher;
SetHandler(&dispatcher, some_result);
dispatcher.Dispatch();
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.