c++ - 在堆栈上分配和从函数返回 QSharedPointer

标签 c++ qt smart-pointers qsharedpointer

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

最佳答案

您正在寻找的语言是:“按值返回 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 标准中没有任何内容表明从方法/函数返回任何内容是使用堆栈、寄存器或其他任何特定内容完成的。妖精可能会携带刻在石板上的值(value)观。就C++而言,stack是std命名空间中的一个类,没有其他堆栈可言。该语言在规范级别完全与堆栈无关。堆栈是您此时不必担心的实现细节。您基本上是在引入一个不属于这里的概念。

关于c++ - 在堆栈上分配和从函数返回 QSharedPointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22587713/

相关文章:

C++ ctors : What's the point of using initializer list in a . cpp 文件?

c++ - 在 Qt 5 中,显示多显示器全屏 QWidget 窗口的正确方法是什么?

c++ - QML [未定义] 错误

rust - 什么时候应该使用智能指针?

c++ - 如何为 sprintf 制作可变大小的字符串

c++ - 运算符重载为友元函数

c++ - 当结构对象超出范围时,如何删除结构对象内的指针?

c++ - QGraphicsScene 的奇怪问题

c++ - 在 boost python 中使用自定义智能指针

c++ - 混合 shared_ptr 和普通 ptr