Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Oct 1996 08:15:01 -0400 (EDT)
From:      Richard Toren <rpt@sso.wdl.lmco.com>
To:        hackers <hackers@FreeBSD.org>
Subject:   Re: C++ question
Message-ID:  <Pine.SUN.3.91.961019081145.14917A-100000@miles>
In-Reply-To: <199610172119.PAA20617@rocky.mt.sri.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Here is another anomoly between g++ and Sun C++ 4.1

Here is one from the obscure pages of the ARM (I hope).

What action is to be taken when an object is passed by value to a
function that uses 'varargs'. Is the copy ctor called? is the dtor
also supposed to be called?

Who did it correctly ??

The following situation was noticed due to a type (rather common) when
attempting to print the address of an object, and the '&' was left
off. Unfortunately, the real object was a reference counted pointer. I
noticed that the Sun 4.1 C++ compiler used the supplied copy ctor, but
never called the dtor. This left the reference count one too high.

Some experimenting with G++ and an old CenterLine compiler showed that
both of these made copies in the stack without calling the copy ctor
(probably just the compilers byte-wise copy) and then passed the
adress rather than the object itself.

Sun C++ 4.1 gave no warnings (even with +w).
CenterLine gave no warnings, but did not call the user copy ctor.
G++ gave a warning 
     (missingDtor.C:39: warning: cannot pass objects 
                        of type `Apple' through `...'

G++ output looks like:
  copyCtorbug - called with 1 args
  empty ctor - refCount=1
  The real address of myfruit is 0xefbfd6b4
  Addr of myfruit is 0xefbfd6ac
  refCount = 1
  dtor - refCount=0

  copyCtorbug - called with 2 args
  empty ctor - refCount=1
  The real address of myfruit is 0xefbfd6ac
  Addr of myfruit is 0xefbfd6ac
  refCount = 1
  dtor - refCount=0

CenterLine gave essentialy the same result.

Sun compiler gave:
  copyCtorbug - called with 1 args
  empty ctor - refCount=1
  The real address of myfruit is 0xeffff1e0
  copy ctor - refCount = 2                   // !!!!!!!!!!
  Addr of myfruit is 0xeffff1d8
  refCount = 2
  dtor - refCount=1                          // wrong ???

  copyCtorbug - called with 2 args
  empty ctor - refCount=1
  The real address of myfruit is 0xeffff1d8
  Addr of myfruit is 0xeffff1d8
  refCount = 1
  dtor - refCount=0


//
// test missing dtor with call to vararg
//

#include <stdio.h>

 int refCount = 0;


class Apple {
    int   somevalue;
public:
    Apple ( ):somevalue(100) {
        refCount ++;
        printf("empty ctor - refCount=%d\n",refCount);
    }
    Apple(const Apple& rs) {
        refCount++;
        printf("copy ctor - refCount=%d\n",refCount);
        somevalue = rs.somevalue;
    }
    ~Apple ( ) {
        refCount--;
        printf("dtor - refCount=%d\n",refCount);
    }
};


main (int argc, char **argv )
{
    printf("\n\n\ncopyCtorbug - called with %d args\n",argc);
    Apple myfruit;
    Apple *mfp;
    
    mfp = &myfruit;
    printf("The real address of myfruit is %#x\n",mfp);

    if (argc==1) {
        printf("Addr of myfruit is %#x\n",  myfruit);
    }else {
        printf("Addr of myfruit is %#x\n", &myfruit);
    }
    printf("refCount = %d\n",refCount);
    return 0;
}



                         ====================================================
Rip Toren               | The bad news is that C++ is not an object-oriented |
rpt@sso.wdl.lmco.com    | programming language. .... The good news is that   |
                        | C++ supports object-oriented programming.          |
                        |    C++ Programming & Fundamental Concepts          |
                        |     by Anderson & Heinze                           |
                         ====================================================




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.SUN.3.91.961019081145.14917A-100000>