我需要能夠訪問其在不同的具體類實現返回一個對象。所以我決定使用std::shared_ptr
。我想知道在這裏使用std::shared_ptr
是否合適,如果不是,請建議我是否應該使用std::weak_ptr
。到目前爲止,我一直在使用原始指針,但現在我決定在我的項目中使用智能指針,但我無法決定在這裏使用哪一個。下面的代碼段與我在我的項目中試圖做的類似。與shared_ptr的工作從另一個具體類
#include <iostream>
#include <memory>
class data
{
public:
data()
{
std::cout<<"\n data constructor Called"<<std::endl;
}
~data()
{
std::cout<<"\n data destructor Called"<<std::endl;
}
int GetData()
{
return val;
}
void SetData(int & val)
{
this->val = val;
}
private:
int val;
};
class sample
{
public:
sample();
~sample();
void GetShared(std::shared_ptr<data> & arg);
std::shared_ptr<data> sPtr;
};
sample::sample()
{
sPtr = std::make_shared<data>();
}
sample::~sample()
{
}
void sample::GetShared(std::shared_ptr<data> & arg)
{
arg = sPtr;
}
int main()
{
int val = 40;
sample obj;
{
std::shared_ptr<data> temp1;
obj.GetShared(temp1);
temp1->SetData(val);
std::cout<<"\n Data : "<<temp1->GetData()<<std::endl;
} // Just to understand whether pointer gets deleted if temp1 goes out of scope.
{
std::shared_ptr<data> temp2;
obj.GetShared(temp2);
val = 20;
temp2->SetData(val);
std::cout<<"\n Data : "<<temp2->GetData()<<std::endl;
}
return 0;
}
非常清楚,但(在恢復正常的指針或引用的情況下),如果用戶正在試圖刪除由方法'obj.GetShared(temp1);'返回的指針。在返回的'std :: shared_ptr'上應用'delete'會引發編譯錯誤。我在這裏錯過了什麼,是否仍然推薦使用普通指針? – Panch
@Panch用戶不應該刪除原始指針。 – Galik
@Galik那麼你如何在C++ 11之前正確地返回一個數組?我看到一個指針被用於這個和「用戶」必須刪除數據的類似用例。 –