In order to avoid duplication of elements, I'm building a class that holds elements and provide an acces to them.
My elements (DynLibrary
) are movable but not copyable
class DynLibrary
{
public:
DynLibrary() : _handle(nullptr) {}
DynLibrary(const std::string& path) { DynLibrary::open(path); }
DynLibrary(const DynLibrary&) = delete;
DynLibrary(DynLibrary&&) = default;
~DynLibrary() { DynLibrary::close(); }
...
}
Those object are allocated in an unordered_map
which key is the path that generated them. I'm allocation them that way
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;
};
However when calling DynAllocator::library
I get the following output:
@Emplace
close 0x1dfd1e0 // DynLibrary destructor
@Return
Which means that the object which is inserted has somehow been copied and the destructor of the copy just invalidated my object (calling dlclose
with my handler)
- Is my movable but not copyable approach of
DynLibrary
ok ? - How can I insert an instance of
DynLibrary
if myunordered_map
without copy ?
Please note that I know how to do that using pointers / smart pointers (std::unique_ptr
) but that i'd like to avoid them at all cost !
Aucun commentaire:
Enregistrer un commentaire