On Jul 4, 3:44 pm, Maxim Yegorushkin <[EMAIL PROTECTED]>
wrote:
> On 4 Jul, 16:55, [EMAIL PROTECTED] wrote:
>
>
>
> > I have the following program:
>
> > class A
> > {
> >   string s;
>
> >   public:
> >   A(const string& a) : s(a) { cout << s << endl; }
>
> > };
>
> > class B : public A
> > {
> >   public:
> >   B(const string& b) : A(b) { }
>
> > };
>
> > class C : public B
> > {
> >   public:
> >   C() : B(string("ABC")) { }
>
> > };
>
> > int main(int argc, char *argv)
> > {
>
> > unsigned char i = 0;
>
> > C* c = new C;
>
> > delete c;}
>
> > /////////////////////////////////////////////////////////
>
> > If I put the delete c statement in comment, valgrind will report that
> > I'm leaking c AND the string temporary created when invoking B ctor.
> > why ?
>
> GNU C++ std::basic_string<> uses reference counting and copy-on-write.
> It means that the memory allocated by the temporary is shared by A::s.
> When destructor of A::s is not called it leaks memory, and that memory
> was allocated by the temporary.

Darn optimization ! ;-)

Thanks for the explanation, it all make sense now. Got any reference
on the web on that and other similar feature implemented in g++ ?

_______________________________________________
help-gplusplus mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/help-gplusplus

Reply via email to