Использование и определение класса деструктора

Я создал класс для TFT-кнопок и сообщений при использовании сенсорного дисплея Wemos 2.4 tft.

В коде я использую около 12 кнопок (3 разных экрана с 4 кнопками на каждом экране ), например, в моем коде управления домом "Главный экран" имеет подсветку, сигналы тревоги Windows, температуру, и на каждом экране ниже есть множество других.

Так как кнопка, средняя продолжительность жизни только для текущего экрана (также в цикле() , поскольку он дисплее нажмите на определенное место), и каждая кнопка уйдет не мало ресурсов, как показано ниже в lib же .сек файл (другой класс с функцией касания не показывают здесь), я хотел бы знать, как создать деструктор, чтобы освободить место, так как основные ресурсы, используемые в MessageTFT класса.

#ifndef TFT_GUI_h
#define TFT_GUI_h

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <XPT2046_Touchscreen.h>

extern XPT2046_Touchscreen ts; /* Сенсорный экран */
extern Adafruit_ILI9341 tft;   /* Графика */

const uint8_t _pos_corr_factor[3] = {3, 6, 9}; /* Центрируйте текст внутри поля */
class MessageTFT
{
public:
  uint8_t a, b;
  int xc, yc;
  uint8_t txt_size = 1;
  uint8_t screen_rotation = 0;
  uint8_t border_thickness = 1;
  uint16_t face_color = ILI9341_GREEN;
  uint16_t border_color = ILI9341_RED;
  uint16_t txt_color = ILI9341_BLACK;
  
  char txt_buf[30];
  bool roundRect = false;

public:
  MessageTFT(Adafruit_ILI9341 &_tft);
  void drawMSG();
  void text(char *txt);
private:
  uint8_t _radius = 15;

private:
  void _drawFace();
  void _drawBorder();
  void _put_text();
};
#endif

, 👍1

Обсуждение

Я не вижу ничего в кнопке, которая нуждается в очистке при уничтожении. Деструкторы используются для очистки динамических ресурсов экземпляра (например, памяти malloc-ed)., @Dave Newton


1 ответ


Лучший ответ:

6

Деструкторы, несмотря на их название, не используются для уничтожения объекта. Вместо этого они являются "крючком", который вызывается при уничтожении объекта. Подобно тому, как "конструктор" вызывается при создании объекта - он не создает.

Деструктор предназначен для "очистки" объекта перед его удалением. Это обычно влечет за собой освобождение любой памяти, выделенной объектом во время выполнения (через malloc (), newи т. Д.).

Поскольку вы не делаете во время выполнения ничего, что нужно очистить, вашему деструктору нечего делать. Все ваши переменные-это простая статически выделенная память, как часть самого объекта, поэтому они автоматически уничтожаются при уничтожении объекта.

Вы можете думать об этом как о том, чтобы раздавить машину. Сиденья, двигатель и рулевое колесо-все это раздавлено, и вам не нужно об этом беспокоиться. Но сначала вы хотите вытащить собаку из багажника - вы действительно не хотите, чтобы он был там, когда машина будет раздавлена, все станет очень-очень грязно, и собака будет потеряна навсегда ... :(

,

Почему в багажнике машины собака, @Dave Newton

@DaveNewton, чтобы он не мешал вам во время вождения. Это поместье, а не седан., @Majenko

*лол-фью* Просто хотел убедиться, что с собачкой все в порядке ;), @Dave Newton

@DaveNewton До тех пор, пока вы вынимаете его из машины, прежде чем раздавить, да., @Majenko

Есть ли способ уничтожить экземпляр? оставив собаку в покое..., @Guy . D

@Парень.D Если вы создали его как локальную переменную (не используя " new "и не имея его "static" или в глобальной области видимости), то он уничтожается, когда выходит за пределы области видимости. Если вы сделали это с помощью "нового", то вы можете "удалить" его в любое время. Если он находится в глобальном масштабе, то он там навсегда., @Majenko

@Majenko поскольку он должен работать в loop (), чтобы обнаружить прикосновение, он должен быть глобальным.... TNX, @Guy . D