Может кто-нибудь, почему двойное удаление здесь, и как я могу избежать этой аварии? Сбой возникает только при выходе из программы.Как избежать двойного удаления?
#include <iostream>
#include <string>
#include <unordered_map>
#include <memory>
#include <conio.h>
struct State;
struct FlyweightStates {
static std::unordered_map<std::string, std::shared_ptr<State>> prototypes;
static void insertPrototype (const std::string& tag, State* state) {
prototypes.emplace(tag, std::shared_ptr<State>(state));
std::cout << tag << " inserted in FlyweightStates::prototypes." << std::endl;
}
};
std::unordered_map<std::string, std::shared_ptr<State>> FlyweightStates::prototypes;
struct State {
virtual ~State() {std::cout << "State destructor called." << std::endl; _getch();}
State (const std::string& name) {
FlyweightStates::insertPrototype(name, this);
}
};
struct Sleeping : public State {
static Sleeping prototype;
Sleeping() : State("Sleeping") {}
};
Sleeping Sleeping::prototype;
int main() {}
Также врезается является следующее:
struct FlyweightStates {
static std::unordered_map<std::string, std::shared_ptr<State>> prototypes;
static void insertPrototype (const std::string& tag, std::shared_ptr<State> state) {
prototypes.emplace(tag, state);
std::cout << tag << " inserted in FlyweightStates::prototypes." << std::endl;
}
};
std::unordered_map<std::string, std::shared_ptr<State>> FlyweightStates::prototypes;
struct State {
virtual ~State() {std::cout << "State destructor called." << std::endl; _getch();}
State (const std::string& stateName) {
FlyweightStates::insertPrototype (stateName, std::shared_ptr<State>(this));
}
};
Что я могу сделать, чтобы избежать двойного удаления? Я не могу использовать shared_from_this(). Мне нужно shared_ptrs в мусорном хранилище.
Это тонна кода без указания того, что не удается или где он терпит неудачу. Пожалуйста, предоставьте более подробную информацию. – nvoigt
Авария возникает только при выходе из программы. – prestokeys
@nvoigt Это полный пример. [Coliru] (http://coliru.stacked-crooked.com/a/ec05e67ebd3cdcf4) – Csq