Поскольку вы используете c ++, вы можете поместить деструктор в структуру, чтобы сделать это автоматически для вас.Есть и другие способы, но это самый практичный:
struct gnt
{
unsigned int* num;
unsigned int size;
bool negative;
~gnt() {delete [] num; }
};
Я бы также предложил иметь конструктор, который бы удостоверился, что num имеет значение null до его инициализации, поэтому деструктор будет безопасно работать до этого:
struct gnt
{
unsigned int* num;
unsigned int size;
bool negative;
gnt() : num(NULL) {}
~gnt() {delete [] num; }
};
Чтобы иметь безопасное поведение, когда экземпляры назначаются или инициализируются при создании, вам нужен конструктор копирования и оператор присваивания.Они должны скопировать значения всех нединамических элементов и создать дубликат num с тем же размером и содержимым.В этом случае также рекомендуется инициализировать все члены в конструкторе, потому что размер также должен всегда иметь допустимое содержимое, чтобы это работало.Если вы не хотите сейчас слишком усложнять вещи, просто сделайте их приватными, это заставит компилятор лаять, если вы попытаетесь (неподдерживаемо) назначить или скопировать объект:
struct gnt
{
unsigned int* num;
unsigned int size;
bool negative;
gnt() : num(NULL) {}
~gnt() {delete [] num; }
private: gnt(const gnt&); gnt &operator = (gnt &);
};
Как и другиеПредполагается, что одной из альтернатив является использование std :: vector вместо необработанного указателя.Таким образом, вам не нужно беспокоиться об освобождении:
struct gnt
{
std::vector<unsigned int> num;
unsigned int size;
bool negative;
};
О вопросе «Должен ли я беспокоиться о самой структуре?», Это зависит от того, как вы создали ее экземпляры.Если это было с оператором нового, да.В противном случае они будут освобождены при выходе из области видимости, как и любая другая переменная.
Наконец, в отношении рекурсии IMO редко выбирает эффективность кода.Вы должны использовать рекурсию только в том случае, если код становится проще / чище И нет опасности неблагоприятных последствий (например, переполнение стека).Если это не так, я бы всегда использовал итеративную версию.