Что происходит, когда я вызываю деструктор из нового размещения внутри std :: vector? - PullRequest
5 голосов
/ 26 мая 2020

Если у меня есть следующие

#include <vector>

class C
{
public:
    C()
    :
        m_d(new int)
    {
        *m_d = 2;
    }

    ~C()
    {
        delete m_d;
    }

    int* m_d;
};

int main()
{
    std::vector<char> data;

    data.resize(sizeof(C));

    C* newC = new(&data[0]) C;

    C* cAgain = reinterpret_cast<C*>(&data[0]);
    cAgain->~C();

    return 0;
}

Что именно происходит? Когда std::vector<char> уничтожается, освобождает ли он память дважды? Если нет, то почему? Если да, то как бы вы это предотвратили?

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

std::vector<char> data; обрабатывает свою собственную память, которая содержит char, не связанную с C.

C* newC = new(&data[0]) C; вызовите конструктор C, (который выделяет).

Когда newC покидает область видимости, деструктор C НЕ вызывается. (newC - это просто указатель, а не C)

cAgain->~C(); вызов деструктора C (хорошо). Что касается newC, когда область видимости заканчивается, не вызывается (дополнительный) деструктор C.

Таким образом, предполагая правильное выравнивание и смещение между newC и cAgain правильным , ваш код в порядке, без утечек.

0 голосов
/ 26 мая 2020

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

поэтому вызывается только один деструктор ~ C ()

...