[Development] Making QScopedPointer scoped (again)

Olivier Goffart olivier at woboq.com
Tue Sep 3 19:17:53 CEST 2013


Hi,

In modern C++, one should not handle pointer directly.  This is very error 
prone.
Qt was designed before C++98 was standardized.  The parent-child memory 
management is great, but not perfect.
Using raw pointer all over the place is confusing because you never know what 
is the ownership of your pointers.
Smart pointer allow you to take ownership explicitly.

Example:
  QGraphicsView::addItem(QGraphicsItem *item)

When you call this function, who gets the ownership?  You need to go in the 
documentation to find out. And it's not easy to remember or even guess because 
even Qt is not always consistent.  

 QGraphicesView::addItem(QScopedPointer<QGraphicsItem> item)

now you know that the the ownership is taken by the view.
Or, in case of shared ownership:

  QAbstractItemView::setSelectionModel(QSharedPointer<QAbstractItemModel> itm)

And if you return a scoped pointer, it means the caller takes ownership

  QScopedPointer<QStyle> QStyleFactory::create(QString);


Each C++ library come with its own set of smart pointer. Now that C++11 is 
there I think we should align to the same semantics, that's what C++ 
developers should learn.


On Tuesday 03 September 2013 10:02:52 Stephen Kelly wrote:
> [...]
> Again, this is what std::unique_ptr is for. We should not try to turn
> QScopedPointer into an attempt at a NIH std::unique_ptr. Where people have a
> need for a std::unique_ptr, they should use it. We should not adapt
> QScopedPointer to fit the need instead.


But because we don't want to use the STL in our ABI, we can't use 
std::unique_ptr as parameter or return value of our exported functions.

So we have to duplicate, or we have to reconsider that decision not to use the 
STL.


> Adding a move contructor to QScopedPointer makes no sense, because moving
> means 'escaping the scope', which breaks the fundamental point of
> QScopedPointer. QScopedPointer is different to std::unique_ptr and should
> remain so.

I disagree.  The fact that you can exit the scope explicitly is perfectly fine.

I would even go further and add conversions operators for STL compatibility:

inline QScopePointer<T>::QScopePointer(std::unique_ptr<T> other)
inline QScopePointer<T>::operator std::unique_ptr<T>()

-- 
Olivier

Woboq - Qt services and support - http://woboq.com - http://code.woboq.org





More information about the Development mailing list