LINUX.ORG.RU

«Лишний» деструктор при компиляции с gcc


0

0

Вот программа:

#include <iostream> using namespace std;

// Обявляется класс с конструктором, деструктором и функцией get(), которая // возвращает закрый параметр a : class myclass { int a; public: myclass(int n){a=n; cout<<"Konstruktor\n";}; ~myclass(){cout<<"Destruktor\n";}; int get(){ return a;}; };

// Создается функция, которой передается класс: void show(myclass b) { cout<< b.get() <<"\n"; };

void main() { myclass s(5); show(s); }

Функции передается копия обекта s, которая затем уничтожается деструктором. Итого, должет сработать один конструктор и два деструктора: один для копии объекта по выходе из функции, другой для самого объекта при завешении программы. По крайней мере, так написано в учебнике.

Однако у меня срабатывает три деструктора. Т.е. программа на выходе дает:

Konstruktor 5 Destruktor Destruktor Destruktor

Но это если использовать gcc.

При использовании двух других компиляторов (не под LINUX) в программе срабатывает два деструктора, как и написано в книге.

Откуда лишний деструктор при компиляции с помощью gcc?

Заранее благодарен.

anonymous

Да, интересно...
А у меня вообще при компиляции с cxx на Альфе деструктор вызвался только один раз!
Как будто void show(myclass & b) { cout<< b.get() <<"\n"; };
А при компиляции g++ тогй же программы, как ты и описывал, 3 раза 8-\?

Die-Hard ★★★★★
()

Не знаю, при сборке gcc 3.2 (Linux/i686) деструктор вызывался два раза. Как бы то ни было, не void main() а int main()!!!!! Для прояснения ситуации могу посоветовать определить конструкторы по умолчанию и копирования -- чтобы они выводили какую-нить диагностику и посмотреть. Еще можно попробовать выводить this в деструкторе

aa5779
()

Эксперименты с gcc 2.95.2 на i686:
#include <iostream>

class myclass {
  int a;
public:
  myclass(int n){
    a=n; cout<<"Constructor\n";
  };
//#ifdef SKIP
  myclass(myclass &b){
    cout<<"CopyConstructor\n";
    a=b.get();
  };
//#endif
  ~myclass(){
    cout<<"Destructor\n";
  };
  int get(){
    return a;
  };
};

void show(myclass  b) {
  cout<< b.get() <<"\n";
};

void main() { myclass s(5); show(s); }

Constructor
CopyConstructor
5
Destructor
Destructor


Если комментарии убрать, получим:
Constructor
5
Destructor
Destructor
Destructor


Если (без copy  конструктора) засунуть оптимизацию >= 3, то
Constructor
5
Destructor
Destructor
 

cxx на Альфе всегда (независимо от оптимизаций и наличия copy  конструктора)
дает 
Constructor
5
Destructor

Глюкодром!

Die-Hard ★★★★★
()

А на MS компиляторе:
1) если комментарии на месте получаем:
Constructor
CopyConstructor
5
Destructor
Destructor

2) если убрать комментарий то:

Constructor
5
Destructor
Destructor

Что есть правильно.

anonymous
()

IMHO: если не описан явно конструктор копирования, то компилятор лепит свой по умолчанию.

anonymous
()

Вот тоже попробовал - действительно три деструктора для 3-х разных объектов (добавил cout<< (void*)this << endl; в деструкторе)

Вывод один - переопределяйте конструкторы копирования и оператор присваивания.

Хотя с моей точки зрения три вызова деструктора это уже слишком...

tvn
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.