我想让一个类包含一个由构造函数初始化的 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()
时,返回的指针可能分配在与堆并列的堆栈上。现在我假设是这种情况,因为在构造函数完成执行后我得到了一个错误。
基本上我依靠一个函数给我一个指针,然后我可以在别处使用它。但是,该函数在堆栈而不是堆上分配对象。
有没有什么特殊的方法可以解决这个问题,比如双指针?还是每次我想在每个执行 block 中使用指针时都必须调用 ObjectC::getPointer()
?如果我在 ObjectA
中有很多依赖于 myPointer
的函数,那么每个函数调用 ObjectC::getPointer()
将是多余的,但我不我不知道是否有更好的方法来解决这个问题,我觉得函数 (ObjectC::getPointer()
) 不应该强制我进行冗余。
最佳答案
当您调用 ObjectC::getPointer()
时,您得到的不仅仅是“a”指针。该函数必须指定哪些操作对指针有效,特别是应该如何处理它。
通常,这将是 delete
,但也可以是例如关闭
。您必须阅读文档。如果返回指针的生命周期与 objectC
的生命周期匹配,则 objectC
的生命周期应与 myPointer
匹配。所以它可能应该是一个成员,这反过来意味着 myPointer
可能是多余的。您可以只替换 private: ObjectB& getB() { return *myObjectC.GetPointer();
关于c++ - 需要一个堆分配指针,但我得到了一个堆栈分配指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17227043/