[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