简体   繁体   English

什么原因导致删除大小不匹配?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM