繁体   English   中英

需要一个堆分配的指针,但是我给了一个堆栈分配的指针

[英]Need a heap allocated pointer, but I'm given a stack allocated pointer

我想让一个类包含一个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() )不应该强迫我这样做。

当您调用ObjectC::getPointer() ,您不仅会获得“ a”指针。 该函数必须指定对指针有效的操作,尤其是应如何处置它。

通常,这将是delete ,但也可能是例如fclose 您必须阅读文档。 如果返回的指针的寿命的那一世匹配objectC ,则寿命objectC应该匹配myPointer 因此它可能应该是成员,这反过来意味着myPointer可能是多余的。 您可以用private: ObjectB& getB() { return *myObjectC.GetPointer(); }代替private: ObjectB& getB() { return *myObjectC.GetPointer(); } private: ObjectB& getB() { return *myObjectC.GetPointer(); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM