Boost logo

Boost Users :

From: adharankar_at_[hidden]
Date: 2006-03-02 19:18:30


What is wrong in assigning a smart/shared_ptr pointer in C++ code to a struct which may then be passed to a C code?

Consider the sample source towards the end of this email. When I run this through valgrind (memory debugger, see, it points out potential problem (also listed after the sample code). It also seems to cause memory corruption.

What may be a better way of saving/storing a smart/shared_ptr pointer in a C struct (and yet have the reference counter in the smart/shared_ptr pointer increment)?

Best regards,

--------------------- The sample program --------------------
#include <boost/shared_ptr.hpp>

class A {
  int val;
typedef boost::shared_ptr<A> APtr;

struct S {
   APtr aptr;

struct S *func(void) {
 A *a = new A;
 a->val = 12;

 APtr aptr(a);

 struct S *s = (struct S *)malloc(sizeof(struct S));
 s->aptr = aptr;

 return s;

int main(int ac, char *av[]) {
 struct S *s;
 s = func();

 APtr aptr = s->aptr;

Output from valgrind:

Conditional jump or move depends on uninitialised value(s)
 at 0x8048A20: boost::detail::shared_count::operator=
   (boost::detail::shared_count const&) (shared_count.hpp:179)
 by 0x80487FD: boost::shared_ptr<A>::operator=
   (boost::shared_ptr<A> const&) (shared_ptr.hpp:148)
 by 0x80486E8: func() (c.cpp:22)
 by 0x8048742: main (c.cpp:30)

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at