@liver2009

Почему при вызове деструктора не меняется переменная?

#include <iostream>
#include <string>
using namespace std;

class BaseCl {
protected:
    int index;

public:

};

class b : public BaseCl {
private:
    
    string* str;

public:
    b() {

        str = nullptr;
    }

    ~b() {

        cout << str << endl;

    }

    void setb(int i) {
        this->index = i;
        str = new string[2];
        str[0] = "str0 index of b object " + to_string(i);
        str[1] = "str1 index of b object " + to_string(i);
    }
};

class a {
private:
    b* bObj;
    int delete_counter = 0;
public:

    a() {
        bObj = nullptr;

    }

    a(int size) {
        bObj = new b[size];

        for (int i = 0; i < size; i++) {
            bObj[i].setb(i);
        }

        delete_counter++;
    }

    ~a() {
        if (delete_counter > 0) {
            delete[] bObj;
            delete_counter--;
        }
    }
};

int main()
{
    cout << "Hello World!\n";

    a* aobj1;
    aobj1 = new a;

    aobj1[0] = a(2);

    delete aobj1;
}


Прогонял сей код в отладчике. И не могу понять почему, когда у меня вызывается второй раз деструктор в классе а, то переменная delete_counter=1. Т.е. по окончанию работы деструктора класса а она становится равной нулю, однако при вызове деструктора второй раз она снова становится равной единице.

Подскажите, пожалуйста, в чем может быть причина, или что можно почитать на эту тему.
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Я так понимаю, у вас проблема со строчкой
aobj1[0] = a(2);

Тут вызывается конструктор для временного значения a. Потом оператор копирования из временной переменной в *aobj. Потом вызывается деструктор временного значения.

А потом где-то в конце произойдет и деструктор aobj.

У aobj delete_counter после этой строчки равен 1 (ведь он скопирован у временного значения, которое сделало delete_counter единицей в констукторе). В конце при вызове деструктора aobj там delete_counter будет 1 в начале.

Вы смотрите на адрес this в дебагере в деструкторе. Два вызваных деструктора будут для двух разных объектов (для временного значения и для aobj).

Если вы хотите какой-то счетчик ссылок делать, то вам надо переопределять операторы копирования и перемещения (а так же все возможные конструкторы). И там аккуратно изменять счетчик ссылок. И счетчик ссылок должен быть частью общего объекта - частью класса b, а не класса a.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы