Здравствуйте. Вот пример кода:
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...."?
Для этих целей используйте умный указатель 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();
Не понимаю, кто мешает один раз написать конструктор и деструктор?
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
может даже оказаться эффективным за счет резкого уменьшения обращения к диспетчеру памяти.
link: default null, но значение notNULLСтруктура таблиц, значение по умолчанию
Дана таблица в которой перечислены все дуги связного ориентированного графаВ таблице два числовых поля, в первом указана начальная вершина...
Вот, к примеру, есть всего 10 достаточно больших блоков с каким-либо фоном, которые не умещаются на экранеВ строке по 2 таких блока