I have a simple piece of code to load a shared library
std::shared_ptr<void> hnld;
hnld.reset( dlopen("libFoo.so", RTLD_NOW),dlclose);
if(!hnld){
std::cout << "Failed to load. "<< std::endl;
}
When the library is loaded everything works right, but if it fails the message is displayed, however the code crashes when calling the destructor dlclose, which is expected as the object is invalid.
As !hnld is false, shouldn't know the smart pointer that the destructor shouldn't be called ?
Note I know how to solve this by using another destructor who check if the object is nullptr before calling dlclose. My question is: why does the shared pointer behave like this?