我想做这样的事情:
std::set<my_type*> s;
s.insert(new my_type(...));
...
s.erase(...);
set的擦除将删除指针以避免内存泄漏。
这对C ++容器是否可行,或者正确的解决方案是将容器子类化并编写自己的擦除,还是使用某种智能指针方案?
答案 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(...);