与哑指针不同,我希望我可以在函数中的堆栈上创建QSharedPointer
,然后将其作为返回值返回给另一个相同类型的QSharedPointer
,对吧?通常,这样的指针会指向现在超出范围的内存,因此指针无效,但是QSharedPointer
将确保它保留在内存中,如果它的另一个副本仍然存在,我希望如此。这是对的吗?
答案 0 :(得分:3)
您正在寻找的语言是:“按值返回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命名空间中的一个类,并且没有其他堆栈可以谈论。该语言在规范级别完全与堆栈无关。 Stack是一个实现细节,您现在不必担心。你基本上是在介绍一个不属于这里的概念。
答案 1 :(得分:1)
指针可以存在于堆栈中,但它指向的东西必须在堆上。 (请注意,这同样适用于普通指针以及QSharedPointer
或std::shared_ptr
)。