Когда вы передаете необработанный указатель в функцию, обычно неизвестно, кто, как ожидается, сохранит владение указанным объектом при выходе из функции - вызывающий или вызываемый. В языке нет ничего, чтобы указывать или применять это.
Таким образом, обычно рекомендуется передавать необработанный указатель только в том случае, если вызываемый объект считывает или изменяет объект, но ожидается, что вызывающий объект сохранит владение.
В вашем примере это не так. Вы хотите, чтобы ваши функции стали владельцем выделенных method
объектов. Итак, вы должны изменить свои функции так, чтобы они передавали std::unique_ptr<method>
объекты по значению, вместо того, чтобы передавать необработанные method*
указатели. Это делает очень явным, что ожидается, что владение переходит от вызывающего к вызываемому, например:
#include <iostream>
#include <memory>
#include <map>
struct method {
virtual ~method() { std::cout << "f\n"; };
};
typedef std::unique_ptr<method> MPTR;
std::map<int, MPTR> tbl;
void insert(int id, MPTR m) {
tbl.insert(std::make_pair(id, std::move(m)));
};
void set(int id, MPTR m) {
tbl[id] = std::move(m);
};
int main()
{
insert(1, MPTR(new method)); // or insert(1, std:::make_unique<method>()) in C++14 and later
set(1, MPTR(new method)); // or set(1, std:::make_unique<method>()) in C++14 and later
return 0;
}
Живая демоверсия