hps@cs.brown.edu (10/27/89)
given following input file (different header file for g++)
#include <stream.h>
#include <string.h>
struct string {
char* p;
int size; // of vec pointed to by p
string(int sz) { p = new char[size=sz]; cout<<"string(int) ctor\n";}
string(char* a) {p = new char[size=strlen(a)+1]; strcpy(p,a);
cout << "string(char*) ctor\n"; }
~string(){delete p; cout << "~string() dtor\n";}
operator char*() {char* a = new char[size]; strcpy(a,p);
cout << "string::operator char*()\n"; return a;}
};
main()
{
char* a="Hello world";
string b="This is a string";
b=a=b=a;
}
CC 2.0 produces this output:
string(char*) ctor
string(char*) ctor
string::operator char*()
string(char*) ctor
~string() dtor
~string() dtor
~string() dtor
However, given the following g++ compilation versions:
g++ -v -o p4 p4.cc
gcc version 1.36.0- (based on GCC 1.36)
/usr/local/gnu/1.36/lib/gcc-cpp -+ -v -I/usr/local/gnu/1.36/lib/g++-include -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ p4.cc /usr/tmp/cca02667.cpp
GNU CPP version 1.36
/usr/local/gnu/1.36/lib/gcc-cc1plus /usr/tmp/cca02667.cpp -quiet -dumpbase p4.cc -version -o /usr/tmp/cca02667.s
GNU C++ version 1.36.0- (based on GCC 1.36) (sparc) compiled by GNU C version 1.36.
default target switches: -mfpu -mepilogue
as -o p4.o /usr/tmp/cca02667.s
/usr/local/gnu/1.36/lib/gcc-ld -o p4 -e start -dc -dp /lib/crt0.o -L/usr/local/gnu/1.36/lib p4.o -lg++ /usr/local/gnu/1.36/lib/gcc-gnulib -lc
I get the following output:
string(char*) ctor
string(char*) ctor
string::operator char*()
string(char*) ctor
~string() dtor
indicating implicit conversion temporaries aren't being destroyed.
No, I don't defend this coding style...
-Page