Как освободить память сразу всем полям структуры?

483
04 января 2017, 02:55

Здравствуйте. Вот пример кода:

struct BUFF
{
    int * a;
    int * b;
    int * ...;
};
main() {
    BUFF buff;
    buff.a = new int[32];
    buff.b = new int[32];
    buff.... = new int[32];
    // какие-то действия ...
    // освобождение памяти
    delete[] buff.a;
    delete[] buff.b;
    delete[] buff.....;
}

Вопрос:

Есть ли способы удаления сразу всех полей структуры а не по одной строчки "delete[] buff...."?

Answer 1

Для этих целей используйте умный указатель std::unique_ptr. Когда объект структуры прекратит свое существование, то автоматически будут вызваны деструкторы для его полей-указателей.

В процессе работы вы можете назначать новые значения для указателей с помощью функции-члена класса reset.

Например,

#include <memory>
//...
struct BUFF
{
    std::unique_ptr<int[], std::default_delete<int[]>> a;
    std::unique_ptr<int[], std::default_delete<int[]>> b;
    std::unique_ptr<int[], std::default_delete<int[]>> c;
};

BUFF buff = BUFF();
// ...
buff.a.reset(new int[32]);
buff.b.reset(new int[32]);
buff.c.reset(new int[32]);

Другой подход - это написать отдельную функцию-член структуры следующим образом

#include <algorithm>
#include <memory>
//...
struct BUFF
{
    int *a;
    int *b;
    int *c;
    void reset()
    {
        std::initializer_list<int *> l = { a, b, c };
        std::for_each(l.begin(), l.end(), std::default_delete<int[]>());
    }
};
//...
BUFF buff = BUFF();
//...
buff.reset();
Answer 2

Не понимаю, кто мешает один раз написать конструктор и деструктор?

struct BUFF
{
    int * a;
    int * b;
    int * ...;
    BUFF():a(new int[32]),b(new int[32]),...{}
    ~BUFF(){ delete[]a; delete[] b; ... }
};
main() {
    BUFF buff;
    // какие-то действия ...
    // освобождение памяти - НИЧЕГО
}

Можно проявить особую хитро...сть :) и сделать так:

struct BUFF
{
    int * a;
    int * b;
    int * ...;
    BUFF():a(new int[128])
    {
        b = a + 32;
        ...
    }
    ~BUFF(){ delete[]a; }
};

В принципе, при большом количестве полей и частом создании и удалении BUFF может даже оказаться эффективным за счет резкого уменьшения обращения к диспетчеру памяти.

READ ALSO
Ассемблерная команда LEA

Ассемблерная команда LEA

Не знаю почему, но эта ассемблерная команда не дает мне покоя LEA

456
подсчет количества

подсчет количества

link: default null, но значение notNULLСтруктура таблиц, значение по умолчанию

589
Поиск пропавших дуг для полного графа

Поиск пропавших дуг для полного графа

Дана таблица в которой перечислены все дуги связного ориентированного графаВ таблице два числовых поля, в первом указана начальная вершина...

454
Как осуществить скроллинг с блоками?

Как осуществить скроллинг с блоками?

Вот, к примеру, есть всего 10 достаточно больших блоков с каким-либо фоном, которые не умещаются на экранеВ строке по 2 таких блока

466