Для segfault :
Ваш указатель problem_map
неинициализирован в строке 12. Именно поэтому segfault.Вам не нужно tmp
, вы можете просто сделать это:
problem_map = new std::map<std::string, int>;
for (std::string& s : inp) {
(*problem_map)[s] = i++;
}
Теперь для утечки у вас есть два варианта:
1) Добавить деструктор, конструктор копированияи оператор копирования-присвоения (или сделать их удаленными).См. Правило три
class MemoryLeak {
public:
~MemoryLeak() {
delete problem_map;
}
MemoryLeak(const MemoryLeak& ) = delete;
MemoryLeak& operator=(const MemoryLeak& ) = delete;
MemoryLeak(std::vector<std::string>& inp) {
int i = 0;
problem_map = new std::map<std::string, int>;
for (std::string& s : inp) {
(*problem_map)[s] = i++;
}
}
std::map<std::string, int>* problem_map;
};
2) не хранить указатель, а карту
class MemoryLeak {
public:
MemoryLeak(std::vector<std::string>& inp) {
int i = 0;
for (std::string& s : inp) {
problem_map[s] = i++;
}
}
std::map<std::string, int> problem_map;
};