[Interest] Proper use of SharedPointer/WeakPointer

André Somers andre at familiesomers.nl
Thu Feb 23 15:37:00 CET 2012


Op 23-2-2012 15:29, Thiago Macieira schreef:
> On quinta-feira, 23 de fevereiro de 2012 06.26.19, Jason H wrote:
>> So in a return-everything query function, it would look like:
>>
>> QList<QSharedPointer<QObject*>  >  ObjectDatabase::returnAll()
>> {
>>      QList<QSharedPointer<QObject*>  >  results;
>>      foreach (const obj, m_pObjects)
>>      {
>>
>>          results<<  QSharedPointer(obj);
>>      }
>>
>>      return results;
>> }
>>
>> Yes?
> No.
>
> It is something like this:
>
> QList<QSharedPointer<QObject*>  >  ObjectDatabase::returnAll()
> {
> 	return m_pObjects;
> }
>
> You must already have those objects in QSharedPointer somewhere. Otherwise
> QSharedPointer *will* delete them.
Also, to make the whole thing a bit more readable, I prefer to define 
typedefs for all classes that I use as a shared pointer. I postfix SPtr 
to the name of the class for the shared pointer version, but that's a 
matter of preference. I guess some convention would be good.

Thiago's advice is good though: if you use smart pointers, make sure you 
use them everwhere, especially for shared pointers. Any place where you 
see something else besides a new inside the constructor of a shared 
pointer, you know you have a problem. So:

MyClassSPtr obj = MyClassSPtr(new MyClass); //ok
MyClassSPtr obj2 = MyClassSptr(someRawMyClassPtr); // ALERT! Trouble 
about to happen!

Also, beware of QSharedPointer lifetime management interfering with 
QObject lifetime management. IMO, shared pointers of QObjects better 
*not* have parents:

MyClassSPtr obj3 = MyClassSPtr(new MyClass(parentQObject); //could spell 
big trouble!

André




More information about the Interest mailing list