which one of singleton implementation is better and what are advantages and disadvantages?
//first
class singleton_SharedPtr{
public:
singleton_SharedPtr(const singleton_SharedPtr&) = delete;
singleton_SharedPtr& operator=(const singleton_SharedPtr&) = delete;
~singleton_SharedPtr(){}
//is it normal to return weak_ptr instead of share_ptr in the getInstance method????
static std::shared_ptr<int> getInstance(){
std::cout<<"referenced before if condfition, use_count : "<<instance.use_count()<<std::endl;
if(instance==nullptr){
instance=std::make_shared<int>();
}
std::cout<<"referenced after if condfition, use_count : "<<instance.use_count()<<std::endl;
return instance;
}
private:
singleton_SharedPtr(){}
static std::shared_ptr<int> instance;
};
std::shared_ptr<int> singleton_SharedPtr::instance=nullptr;
//second
class singleton_UniquePtr{
public:
singleton_UniquePtr(const singleton_UniquePtr&) = delete;
singleton_UniquePtr& operator=(const singleton_UniquePtr&) = delete;
~singleton_UniquePtr(){}
static int* getInstance(){
if(instance==nullptr){
instance=std::make_unique<int>();
}else
std::cout<<"instance.get: "<<instance.get()<<std::endl;
return instance.get();
}
private:
singleton_UniquePtr(){}
static std::unique_ptr<int> instance;
};
std::unique_ptr<int> singleton_UniquePtr::instance=nullptr;
we need to access to instance inside the loop. will memory leakage happen or not? if yes, which one of them cause to memory leakag.
//1:
while(1){std::shared_ptr<int>sharedPtr=
singleton_SharedPtr::getInstance();
//use sharePtr...
//...
}
//2:
while(1){
std::weak_ptr<int>weakPtr=singleton_SharedPtr::getInstance();
//use sharePtr...
//...
}
//3:
while(1){
int* rawPtr=singleton_UniquePtr::getInstance();
//use rawPtr...
//...
if(rawPtr){
delete rawPtr;
rawPtr=nullptr;
}
}
any suggestion about detail of performance ,memory leakage ,being standard and ... ? thank you very much.