Après avoir compilé ce morceau de code, je reçois des messages d'erreur qui indiquent qu'il se produit une double suppression; ma question est ce qui ne va pas exactement avec ce code? Où le problème se produit-il?

#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;
}

Pourquoi ce code produit-il cette erreur? munmap_chunk (): pointeur invalide abandonné (core dumpé)

0
Artem Hevorhian 4 nov. 2019 à 03:42

2 réponses

Meilleure réponse

Ici, vous passez un shared_ptr à 'this' pendant le constructeur ....

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

Cependant «ceci» est déclaré sur le tas:

  Manager m;

Cela entraînera un problème lorsque le dtor pour InputListener est appelé. Peut-être envisagez-vous de changer manager_ptr_ en un faiblesse_ptr si c'est l'usage prévu pour la classe?

0
robthebloke 4 nov. 2019 à 00:50

Vous avez enveloppé shared_ptr autour d'un gestionnaire qui a déjà un chemin vers la destruction car il est instancié sur la pile.

0
WilliamClements 4 nov. 2019 à 00:51