Boost logo

Boost Users :

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


Greetings...

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 http://www.valgrind.org), 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,
-Arun.

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

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

struct S {
 public:
   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 hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net