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