【发布时间】:2015-04-28 19:09:48
【问题描述】:
为了避免元素重复,我正在构建一个包含元素并提供对它们的访问权限的类。
我的元素 (DynLibrary) 可移动但不可复制
class DynLibrary
{
public:
DynLibrary() : _handle(nullptr) {}
DynLibrary(const std::string& path) { DynLibrary::open(path); }
DynLibrary(const DynLibrary&) = delete;
DynLibrary(DynLibrary&&) = default;
~DynLibrary() { DynLibrary::close(); }
...
}
这些对象在unordered_map 中分配,其中键是生成它们的路径。
我就是这样分配的
class DynAllocator
{
public:
DynLibrary& library(const std::string& f)
{
if (_handles.find(f) == _handles.end())
{
std::cout << "@Emplace" << std::endl;
_handles.emplace(f, DynLibrary(f));
}
std::cout << "@Return" << std::endl;
return _handles.at(f);
}
private:
std::unordered_map<std::string, DynLibrary> _handles;
};
但是,当调用 DynAllocator::library 时,我得到以下输出:
@Emplace
close 0x1dfd1e0 // DynLibrary destructor
@Return
这意味着插入的对象以某种方式被复制并且副本的析构函数刚刚使我的对象无效(使用我的处理程序调用dlclose)
- 我的
DynLibrary的可移动但不可复制的方法好吗? - 如果我的
unordered_map没有副本,我如何插入DynLibrary的实例?
请注意,我知道如何使用指针/智能指针 (std::unique_ptr) 来做到这一点,但我想不惜一切代价避免它们!
【问题讨论】:
标签: c++ c++11 containers destructor rvalue