Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要堆分配的指针,但I';m给定堆栈分配的指针_C++_Pointers_Memory Management - Fatal编程技术网

C++ 需要堆分配的指针,但I';m给定堆栈分配的指针

C++ 需要堆分配的指针,但I';m给定堆栈分配的指针,c++,pointers,memory-management,C++,Pointers,Memory Management,我想让一个类包含一个由构造函数初始化的std::unique\u ptr,然后在类的其他地方使用 我有一个类,它包含一个std::unique\u ptr,如下所示: class ObjectA { public: ObjectA(); ~ObjectA(); void SomeFunction(); private: std::unique_ptr<ObjectB> myPointer; } 但问题是我不能在SomeFunction()中使用my

我想让一个类包含一个由构造函数初始化的
std::unique\u ptr
,然后在类的其他地方使用

我有一个类,它包含一个
std::unique\u ptr
,如下所示:

class ObjectA
{
public:
    ObjectA();
    ~ObjectA();
    void SomeFunction();

private:
    std::unique_ptr<ObjectB> myPointer;
}
但问题是我不能在
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();}

您确定
objectC
不控制指向对象的生存期吗?看来情况就是这样。您可能应该将
ObjectC ObjectC
作为类的成员。另外,
ObjectC ObjectC()
应该是
ObjectC ObjectC(前者是函数声明)。如果不知道ObjectB和ObjectC是如何定义的,就无法确定。
ObjectA::ObjectA()
{
    ObjectC objectC;
    myPointer = std::move(std::unique_ptr<ObjectB>(objectC.getPointer())); //setup pointer
}

ObjectA::~ObjectA() {}

void ObjectA::SomeFunction()
{
    //use myPointer here
}