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

标签 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
}

但问题是我不能在 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/

相关文章:

c++ - 如何在C++中返回一个数组

c++ - "Un-casting"来自 (void *) 并取消对 char 数组的引用

c - 关于C中的指针

c - 将一般深度的嵌套指针传递给 C 中的函数

c - 返回 "local"堆分配对象可能导致内存泄漏

c++ - Qt:如何解析json中的数字

c++ - C/C++ - 计算函数调用中的参数

c++ - 由于私有(private)继承而无法访问的类型

包含结构的 C union - 内存映射 - 编译器跳过一个字节?

c++ - 在 64 位系统的低地址分配内存的最可靠/可移植的方法是什么?