Как деструктор вызывается для объекта кучи без оператора удаления? - PullRequest
0 голосов
/ 07 декабря 2018

Может кто-нибудь объяснить здесь, как деструктор вызывается для объекта, созданного в куче через оператор new, когда не вызывается соответствующее удаление.Кроме того, поскольку в приведенном ниже коде мы перехватываем объект с помощью константной ссылки, а в деструкторе мы меняем значение объекта (т. Е. Устанавливаем n = 0), как это возможно.

class A
{
    private:
        int n;
    public:
        A()
        {
            n=100;
            std::cout<<"In constructor..."<<std::endl;
        }
        ~A()
        {
            n=0;
            std::cout<<"In destructor..."<<std::endl;
        }
};
int main()
{
  try
  {
      throw *(new A());
  }
  catch(const A& obj)
  {
      std::cout<<"Caught...."<<std::endl;
  }

 return 0;
}

Вывод из программы (работает наhttp://cpp.sh/3jm4x):

In constructor...
Caught....
In destructor...

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

У вас действительно есть утечка памяти, потому что вызываемый деструктор не для объекта, выделенного new.

throw *(new A());, приводит к копии объекта, и вы можете видеть, что копияконструктор называется.И это тот объект, для которого деструктор вызывается в конце области действия для catch.

. Вы можете проверить живое демо здесь .

0 голосов
/ 07 декабря 2018

throw делает копию объекта, которая затем автоматически уничтожается после catch.Именно это разрушение вы наблюдаете.Исходный объект, выделенный в куче, действительно никогда не уничтожается.

...