В отличие от тупого указателя, я ожидаю, что я мог бы создать QSharedPointer
в стеке в функции, а затем вернуть его в качестве возвращаемого значения для присвоения другому QSharedPointer
того же типа, верно? Обычно такой указатель будет указывать на память, которая теперь находится вне области видимости, и, следовательно, указатель недопустим, но QSharedPointer
я буду ожидать, что он сохранится в памяти, если останется еще одна копия. Это правильно?
Указатель может жить в стеке, но то, на что он указывает, должно быть в куче. (Обратите внимание, что то же самое относится к обычному указателю, а также QSharedPointer
или std::shared_ptr
).
Язык, который вы ищете: «Возвращение 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, и нет другого стека, о котором можно было бы говорить. Язык полностью независим от стека на уровне спецификации. Стек — это деталь реализации, о которой вам не нужно беспокоиться на данном этапе. Вы в основном вводите концепцию, которой здесь не место.