[comp.lang.c++] Borland C++ bug?

chin@sg1.chem.upenn.edu (Chin Wu) (08/02/90)

Following codes illustrate a possible bug in temporary objects
handling by Borland C++ compiler.

**** code followed ****
#include <iostream.h>

class String
{
    int len;
    char *st;
  public:
    friend ostream& operator << (ostream& out, String& s);
    String(char *s);
    String(String& s);
    ~String(void) { cout << "Destructor\n"; delete st; };
};

inline ostream& operator << (ostream& out, String& s)
{
    out << s.st;
    return out;
};

String::String(char *s)
{
    len = strlen(s);
    st = new char[len + 1];
    strcpy(st, s);
    cout << "Constructor A\n";
};

String::String(String& s)
{
    len = s.len;
    st = new char[len + 1];
    strcpy(st, s.st);
    cout << "Constructor B\n";
};

String test(void) { return String("Hello"); };

main()
{
    String d = test();
    cout << d << '\n';
};

**** result followed ****
Constructor A
Constructor B
Constructor B

Destructor
Destructor
**************************

There is one less Destructor has been called and the content of the
temporary String object has lost, "Hello" in this case. To work around
the problem I have to declare a variable in String test(void); 
like:
    String test(void) { String stupid = "Hello"; return stupid; };

Am I understand C++ wrong? Thanx in advance.

Chin
--
chin@sg1.chem.upenn.edu