Как я могу удалить объект из указателя на массив указателей? - PullRequest
0 голосов
/ 07 марта 2019

Я все еще новичок в ручном уничтожении в C ++ (пришло из языков с сборкой мусора).У меня есть следующее в одном из моих классов:

Input** Inputs;

, который инициализируется следующим образом:

this->Inputs = new Input* [totalInputs];

и может быть переназначенпозже в моем коде в зависимости от пользовательского ввода, похожего на это:

this->Inputs[inputNumber] = new DigitalInput(params...)

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

Каков наилучший способ удаления старого объекта после его переназначения?

Редактировать: я забыл включить, что это на микроконтроллере AVR, работающем на базе кода Arduino.

Редактировать 2: Причина, по которой я делаю это, заключается в том, что пользовательразрешено отправлять команды устройству, которые будут изменять тип ввода (то есть: отправлять команду и this->Inputs[inputNumber] = new AnalogInput(params...). Кроме того, причина, по которой это указатель на массив указателей, заключается в том, что конструктор для этого объекта будет генерировать этот массив на основеtotalInputs передан аргумент. Он находится в разделяемой библиотеке, которая используется в нескольких различных единицах.

Ответы [ 3 ]

5 голосов
/ 07 марта 2019

Лучше вообще не использовать необработанные указатели и использовать контейнеры stl. Один из возможных способов может быть следующим:

using InputPtr = std::unique_ptr<Input>;
std::vector<InputPtr> Inputs;
Inputs.emplace_back(std::make_unique<DigitalInput>());

Больше не нужно беспокоиться об утечках памяти. Другой вариант - использовать std::shared_ptr в зависимости от того, как вы собираетесь использовать свой InputList;

1 голос
/ 07 марта 2019

Если вы переназначаете элемент массива для указания на новый объект, вы можете сначала освободить старый объект, если таковой имеется.

Input* oldInput = this->Inputs[inputNumber];
delete oldInput;

this->Inputs[inputNumber] = new DigitalInput(params...)
0 голосов
/ 07 марта 2019

Если вы хотите удалить объекты в куче:

for(int i = 0; i < totalInputs; ++i) delete Inputs[i]; delete[] Inputs;

Edit: Если вы используете микроконтроллер, лучше вместо этого разместить его в стеке.

Определите максимальный размер вашего массива. Как:

const int MAX = 5;
Inputs inputs[MAX][MAX];

затем просто назначьте ему объекты.

...