自定义擦除c ++集或其他集合

时间:2016-10-19 18:16:13

标签: c++ design-patterns stl c++14

我想做这样的事情:

std::set<my_type*> s;

s.insert(new my_type(...));
...
s.erase(...);

set的擦除将删除指针以避免内存泄漏。

这对C ++容器是否可行,或者正确的解决方案是将容器子类化并编写自己的擦除,还是使用某种智能指针方案?

1 个答案:

答案 0 :(得分:6)

您的set被声明存储my_type,但您发送my_type*,因此代码不一致。无论如何,如果您不需要堆分配,请不要使用它:

std::set<my_type> s;

// Emplace improves on s.insert(my_type(...)); by allowing construction in place
// to minimize move/copy work
s.emplace(...args for my_type...);
...
s.erase(...);

在没有堆分配的情况下,您的my_type析构函数被调用,并且其自身结构不需要delete(或者更确切地说,set在内部管理它。)

如果您需要堆分配,请使用智能指针,因此删除意味着释放(和std::make_unique makes this cleaner and lets you completely avoid all use of new and delete):

std::set<std::unique_ptr<my_type>> s;

s.insert(std::make_unique<my_type>(...));
...
s.erase(...);