dealokacja pamięci przez wywołanie w jawny sposób destruktora

0

Hej
Abstrahując od tego, że nikt tak nie robi bo to jest dziwne (używamy delete albo inteligentnych wskaźników) to czy z punktu widzenia odporności na memory leaki to jest poprawne kasowanie obiektu przez jawne wywołanie destruktora?

#include <stdio.h>
#include <iostream>
#include <memory>

class Base
{
    public:
    virtual ~Base()
    {
        std::cout << "Base dtor" << std::endl;
        //delete of same dynamic allocated resources
    }
};

class Inherited: public Base
{
    public:
    virtual ~Inherited()
    {
        std::cout << "Inherited dtor" << std::endl;
        //delete of same dynamic allocated resources
    }
};

int main()
{
    Base* base = new Inherited();
    base->~Base(); //Inherited dtor, base dtor invoked, the same effect as 'delete base'
                               //if none virtual Base dtor only Base dtor invoked -> memory leak
}
2

Wywołanie destruktora to nie dealokacja. Wywołanie destruktora to wywołanie destruktora.

Więc: nie, to nie jest poprawne z punktu widzenia odporności na memory leaki.

1

Destruktor jest tylko funkcją wołaną kiedy czas życia obiektu dobiegnie końca, jednakże samo wywołanie destruktora nie powoduje "zakończenia życia" obiektu.

Looknij:

#include <iostream>
class A
{
    public:
    int a = 5;
    ~A()
    {
        std::cout<<"DTOR"<<std::endl;
    }
};

int main()
{
    A a;
    a.~A();
    std::cout<<a.a<<std::endl;

    return 0;
}
3

Jedynym uzasadnionym przypadkiem jawnego wywoływania destruktora jest kasowanie obiektów stworzonych przy pomocy placement new.

2

z punktu widzenia odporności na memory leaki to jest poprawne kasowanie obiektu przez jawne wywołanie destruktora

Nie. Jawne wywoływanie desktruktora jest redundantne - komplator "napisze kod" który to zrobi za Ciebie, oraz sam fakt przejścia przez wszystkie desktruktory nie gwarantuje braku memory leaków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1