unique_ptr双重删除错误消息

问题描述 投票:0回答:2

编译这段代码后我收到错误消息,指出那里发生双重删除;我的问题是到底是什么这段代码有误吗?问题在哪里发生?

#include <iostream>
#include <memory>

class Manager;

class Interface {
protected:
  friend class InputListener;
  bool flag_;
};

class InputListener {
public:
  InputListener(std::shared_ptr<Interface> manager_ptr) {
    manager_ptr_ = std::move(manager_ptr);
    std::async(std::launch::async, &InputListener::Run, this);
  }

  void Run() {
    char c;
    std::cin >> c;
    manager_ptr_->flag_ = true;
  }

private:
  std::shared_ptr<Interface> manager_ptr_;
};

class Manager : public Interface {
public:
  Manager()
      : listener_ptr_{
            std::make_unique<InputListener>(std::shared_ptr<Manager>(this))} {}

  void Run() {
    while (true) {
      if (Interface::flag_)
        break;
    }
  }

private:
  std::unique_ptr<InputListener> listener_ptr_;
};

int main() {
  Manager m;
  m.Run();
  return 0;
}

为什么此代码会产生此错误?munmap_chunk():无效的指针中止(核心已弃用)

c++ unique-ptr
2个回答
0
投票

这里您在构造函数期间将shared_ptr传递给'this'。...>

  Manager()
      : listener_ptr_{
            std::make_unique<InputListener>(std::shared_ptr<Manager>(this))} {}

但是在堆上声明了'this':

  Manager m;

这将在调用InputListener的dtor时引起问题。如果这是该类的预期用法,也许可以考虑将manager_ptr_更改为weak_ptr?


0
投票

您将shared_ptr包裹在一个Manager上,该Manager已具有销毁路径,因为它已在堆栈上实例化。

© www.soinside.com 2019 - 2024. All rights reserved.