[Qt-interest] QSharedPointer on opaque data structures
Daniel Franke
franke.daniel at gmail.com
Sat Aug 22 19:00:05 CEST 2009
On Saturday 22 August 2009 18:36:47 you wrote:
> I have a pointer to an opaque data structure, which generally can be used
> as:
>
> struct opaque;
> struct opaque *ptr = opaque_structure_create();
> // deal with 'ptr'
> opaque_structure_free(ptr);
>
> Now I'd like to use 'ptr' as a shared pointer where the last user calls
> 'opaque_structure_free'. From the docs of QSharedPointer (4.5.2), I assumed
> that this should work:
>
> QSharedPointer<struct opaque> sharedPtr(opaque_structure_create(),
> opaque_structure_free);
> // use shared pointer, pass around copies,
> // last user calls opaque_structure_free
>
> However, it does not compile:
>
> /usr/include/qt4/QtCore/qsharedpointer_impl.h:124: error: invalid
> application of 'sizeof' to incomplete type 'struct opaque'
> /usr/include/qt4/QtCore/qsharedpointer_impl.h: In member function 'void
> QtSharedPointer::ExternalRefCount<T>::internalDestroy() [with T = struct
> opaque]':
> /usr/include/qt4/QtCore/qsharedpointer_impl.h:195: instantiated from
> 'bool QtSharedPointer::ExternalRefCount<T>::deref() [with T = struct
> opaque]' /usr/include/qt4/QtCore/qsharedpointer_impl.h:217: instantiated
> from 'QtSharedPointer::ExternalRefCount<T>::~ExternalRefCount() [with T =
> struct opaque]'
> /usr/include/qt4/QtCore/qsharedpointer_impl.h:273: instantiated from here
> /usr/include/qt4/QtCore/qsharedpointer_impl.h:231: warning: possible
> problem detected in invocation of delete operator:
> /usr/include/qt4/QtCore/qsharedpointer_impl.h:231: warning: invalid use of
> incomplete type 'struct opaque'
> [localfile].h:35: warning: forward declaration of 'struct opaque'
> /usr/include/qt4/QtCore/qsharedpointer_impl.h:231: note: neither the
> destructor nor the class-specific operator delete will be called, even if
> they are declared when the class is defined.
If I do this ...
--- qsharedpointer_impl.h.orig 2009-08-22 18:53:11.000000000 +0200
+++ qsharedpointer_impl.h 2009-08-22 18:53:21.000000000 +0200
@@ -121,7 +121,7 @@
inline T *operator->() const { return data(); }
protected:
- inline Basic() : value(0 * sizeof(T)) { }
+ inline Basic() : value(0) { }
// ~Basic();
inline void verifyReconstruction(const T *ptr)
... the quoted error vanishes and the code compiles, but the warnings are
still there.
Would someone care to explain if the sizeof() I removed is significant here?
(I'd be mightily surprised if yes, but hey, one never knows ...)
Thanks
Daniel
More information about the Qt-interest-old
mailing list