2013-06-21 56 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(); }