2013-06-21 51 views
0

我想有一類含有由構造然後在類的其他地方使用的初始化的std::unique_ptr需要一個堆分配指針,但我給出一個堆棧中分配指針

所以我有一個包含std::unique_ptr像這樣一類:

class ObjectA 
{ 
public: 
    ObjectA(); 
    ~ObjectA(); 
    void SomeFunction(); 

private: 
    std::unique_ptr<ObjectB> myPointer; 
} 

那麼類的源文件中myPointer是在構造函數中設置和使用SomeFunction()

ObjectA::ObjectA() 
{ 
    ObjectC objectC; 
    myPointer = std::move(std::unique_ptr<ObjectB>(objectC.getPointer())); //setup pointer 
} 

ObjectA::~ObjectA() {} 

void ObjectA::SomeFunction() 
{ 
    //use myPointer here 
} 

但問題是,我不能在SomeFunction()使用myPointer,這裏的原因。

顯然myPointer必須在堆上分配,以保證在構造函數執行完畢它不會被破壞。假設ObjectC,因此其功能來自外部庫。當我打電話給ObjectC::getPointer()時,返回的指針可能被分配到與堆相關的堆棧上。現在我認爲是這樣,因爲在構造函數完成執行後,我得到一個錯誤。

基本上我依靠功能給我用至極的指針,然後我可以在其他地方使用。但是,該函數將堆中的對象而不是堆分配給堆。

是否有一些特殊的方法來解決這個問題,也許有一個雙指針?或者每次我想在每個執行塊中使用指針時,我只需要撥打ObjectC::getPointer()?如果我有很多的功能,裏面ObjectA依靠myPointer然後調用ObjectC::getPointer()每個功能是多餘的,但我不知道是否有更好的方式來解決這個問題,我覺得自己像一個函數(ObjectC::getPointer())不應該強迫我陷入冗餘。

+1

你確定'objectC'不控制指向對象的生命期嗎?看來是這樣。你可能應該有'ObjectC objectC'作爲你的類的成員。另外,ObjectC objectC();應該是ObjectC objectC;(前者是一個函數聲明)。 –

+1

不知道如何定義ObjectB和ObjectC,這是不可能的。 –

回答

1

當你調用ObjectC::getPointer(),你不只是得到「一個」指針。該函數必須指定哪些操作對指針有效,特別是應如何處理。

通常情況下,這將是delete,但它也可能是如fclose。你必須閱讀文檔。如果返回的指針的壽命匹配objectC的壽命,那麼objectC的壽命應該匹配myPointer。所以它可能應該是一個成員,而這又意味着myPointer可能是多餘的。你可以替換private: ObjectB& getB() { return *myObjectC.GetPointer(); }