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

时间:2013-06-21 03:00:56

标签: c++ pointers memory-management

我希望有一个类包含由构造函数初始化的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
}

问题是,我无法在myPointer中使用SomeFunction(),这就是原因。

显然必须在堆上分配myPointer以确保在构造函数执行完毕后不会销毁它。假设ObjectC及其函数来自外部库。当我调用ObjectC::getPointer()时,返回的指针可能在堆栈上分配给堆。现在我假设是这种情况,因为在构造函数执行完毕后我得到了一个错误。

基本上我依靠一个函数来给我一个指针,然后我可以在其他地方使用它。但是,该函数在堆栈而不是堆上分配对象。

有没有一些特殊的方法来解决这个问题,可能有一个双指针?或者每次我想在每个执行块中使用指针时,我都必须调用ObjectC::getPointer()吗?如果ObjectA中有很多依赖于myPointer的函数,那么每个函数调用ObjectC::getPointer()将是多余的,但我不知道是否有更好的方法来解决这个问题,并且我觉得一个函数(ObjectC::getPointer())不应该强迫我进入冗余。

1 个答案:

答案 0 :(得分:1)

当你致电ObjectC::getPointer()时,你不只是得到“一个”指针。该函数必须指定哪些操作对指针有效,特别是如何处理它。

通常,这将是delete,但它也可以是例如fcloseobjectC。你必须阅读文档。如果返回指针的生命周期与objectC的生命周期匹配,则myPointer的生命周期应与myPointer匹配。所以它可能应该是一个成员,这反过来意味着private: ObjectB& getB() { return *myObjectC.GetPointer(); }可能是多余的。你可以替换{{1}}