【问题标题】:Allocating and returning from function a QSharedPointer on the stack在堆栈上分配和从函数返回 QSharedPointer
【发布时间】:2014-03-23 06:17:31
【问题描述】:

与哑指针不同,我希望我可以在函数的堆栈上创建一个QSharedPointer,然后将其作为返回值返回给另一个相同类型的QSharedPointer,对吧?通常,这样的指针将指向现在超出范围的内存,因此该指针无效,但 QSharedPointer 将确保它保留在内存中,如果它的另一个副本仍然存在,我希望。这是正确的吗?

【问题讨论】:

    标签: c++ qt smart-pointers qsharedpointer


    【解决方案1】:

    您正在寻找的语言是:“按值返回 QSharedPointer” - 这正是您正在做的事情。在函数中分配它的位置是一个正交问题。如果您愿意,当然可以在堆上分配它。

    下面的代码不会泄漏内存,也不会调用任何未定义的行为。在answer1 的堆上分配的共享指针的临时实例将被其共享指针释放。 Q_ASSERT 中指向的值将一直存在,直到语句完成。

    #include <QSharedPointer>
    #include <memory>
    
    QSharedPointer<int> answer1() {
      // shared-pointer-to-integer is on the heap
      std::shared_ptr<QSharedPointer<int>> ptr(new QSharedPointer<int>(new int));
      **ptr = 42;
      return *ptr;
    }
    
    QSharedPointer<int> answer2() {
      // shared-pointer-to-integer is a local value
      QSharedPointer<int> ptr = answer1();
      return ptr;
    }
    
    int main()
    {
       Q_ASSERT(*answer2() == 42);
       return 0;
    }
    

    IIRC 标准中没有任何内容表明从方法/函数返回任何内容是使用堆栈、寄存器或其他任何特定内容完成的。可能有地精携带刻在石板上的价值。就 C++ 而言,堆栈是 std 命名空间中的一个类,没有其他堆栈可言。该语言在规范级别完全与堆栈无关。堆栈是您此时无需担心的实现细节。你基本上是在介绍一个不属于这里的概念。

    【讨论】:

      【解决方案2】:

      指针可以在栈上,但它指向的东西必须在堆上。 (请注意,这同样适用于普通指针以及QSharedPointerstd::shared_ptr)。

      【讨论】:

      • 所以如果我将其创建为QSharedPointer&lt;Interval&gt; newInterval;,然后将其分配为newInterval=QSharedPointer&lt;Interval&gt;(new Interval); 并返回newInterval,那么这应该满足您提出的观点,对吧?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      • 2016-04-14
      • 2012-06-26
      • 2019-09-16
      • 2012-08-01
      • 1970-01-01
      • 2013-04-22
      相关资源
      最近更新 更多