Выделение и возврат из функции QSharedPointer в стеке

В отличие от тупого указателя, я ожидаю, что я мог бы создать QSharedPointer в стеке в функции, а затем вернуть его в качестве возвращаемого значения для присвоения другому QSharedPointer того же типа, верно? Обычно такой указатель будет указывать на память, которая теперь находится вне области видимости, и, следовательно, указатель недопустим, но QSharedPointer я буду ожидать, что он сохранится в памяти, если останется еще одна копия. Это правильно?

1

Решение

Указатель может жить в стеке, но то, на что он указывает, должно быть в куче. (Обратите внимание, что то же самое относится к обычному указателю, а также QSharedPointer или std::shared_ptr).

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, и нет другого стека, о котором можно было бы говорить. Язык полностью независим от стека на уровне спецификации. Стек — это деталь реализации, о которой вам не нужно беспокоиться на данном этапе. Вы в основном вводите концепцию, которой здесь не место.

3

По вопросам рекламы [email protected]