gpt4 book ai didi

c++ - 需要一个堆分配指针,但我得到了一个堆栈分配指针

转载 作者:行者123 更新时间:2023-11-28 07:33:18 26 4
gpt4 key购买 nike

我想让一个类包含一个由构造函数初始化的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com