2

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

4

2 回答 2

4

您正在寻找的语言是:“按值返回 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 命名空间中的一个类,没有其他堆栈可言。该语言在规范级别完全与堆栈无关。堆栈是您此时无需担心的实现细节。你基本上是在介绍一个不属于这里的概念。

于 2014-03-24T05:38:50.603 回答
1

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

于 2014-03-23T06:23:28.403 回答