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

use*_*904 -1 c++ design-patterns stl c++14

我想做这样的事情:

std::set<my_type*> s;

s.insert(new my_type(...));
...
s.erase(...);
Run Code Online (Sandbox Code Playgroud)

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

这是可能的C++容器或适当的解决方案是子类化容器和编写我自己的擦除,或使用某种智能指针方案?

Sha*_*ger 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(...);
Run Code Online (Sandbox Code Playgroud)

如果没有堆分配,my_type则会调用析构函数,并且不需要delete自己的结构(或者更确切地说,set在内部进行管理).

如果你需要堆分配,使用智能指针,所以删除意味着释放(std::make_unique并使这个更清洁,让你完全避免使用newdelete):

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

s.insert(std::make_unique<my_type>(...));
...
s.erase(...);
Run Code Online (Sandbox Code Playgroud)