использование QSharedPointer (аналог shared_ptr в Qt)
Возник следующий вопрос:
Код:
QSharedPointer<int> ptr1 = QSharedPointer(new int (12));
QSharedPointer<int> ptr2 = ptr1;
QSharedPointer<int> ptr3 = QSharedPointer(ptr1.data());
QSharedPointer<int> ptr2 = ptr1;
QSharedPointer<int> ptr3 = QSharedPointer(ptr1.data());
Метод data возвращает обычный указатель (int*).
Получается, что ptr1 и ptr2 указывают на одну область памяти, счетчик ссылок равен 2. Но что произойдет после 3 строчки? По идее ptr3 так же должен указывать на ту же область памяти, что ptr1 и ptr2. Но не совсем понятно увеличится ли счетчик ссылок на данную область памяти?!
спасибо за ответы.
По-моему (лучше в доках посмотрите) нельзя создавать новые шареды на базе одного и того-же сырого. Т.е. третья строчка не верна.
Цитата: sadovoya
По-моему (лучше в доках посмотрите) нельзя создавать новые шареды на базе одного и того-же сырого. Т.е. третья строчка не верна.
Спасибо, нужно было просто еще раз внимательно прочитать комментарий к методу.
T * QSharedPointer::data () const
Returns the value of the pointer referenced by this object.
Note: do not delete the pointer returned by this function or pass it to another function that could delete it, including creating QSharedPointer or QWeakPointer objects.
Код:
QSharedPointer<int> ptr1 = QSharedPointer(new int (12));
Код:
QSharedPointer<int> ptr1 = QSharedPointer<int>(new int (12));
Я бы написал классически:
Код:
QSharedPointer<int> ptr1(new int (12));
Но, нам это все-равно, если посмотреть практически. Qt сама следит за счетчиком и по достижению числа ссылок 0 уничтожает объект, обслуживаемый шаредным указателем.
По поводу изначального вопроса могу добавить еще следующее.
Добавление такого макроса
Код:
#define QT_SHAREDPOINTER_TRACK_POINTERS
Если бы дело касалось только стандарта C++11 и 14, подобная форма записи не особо смутила:
Код:
SomeClass a = SomeClass(something);
Если даже не так, то и тут не все плохо. Многие компиляторы и до нового стандарта научились Return Value Optimization и подобному в духе move-семантики. Поэтому для них тоже все будет почти без накладных расходов. Чтобы не выяснять наличие move-конструктора или уповать на разумность компилятора, лучше создавать объект прямо:
Код:
SomeClass a(something);