Вы можете удалить выделенные объекты, используя delete objPtr
.В вашем случае,
for (int i = 0; i < 10; i++)
{
delete arptr[i];
arptr[i] = 0;
}
Практическое правило, которое нужно запомнить: если вы выделяете объект с помощью new
, вы должны delete
его.Если вы выделяете массив объектов, используя new[N]
, то вы должны delete[]
it.
Вместо того, чтобы вставлять указатели в необработанный массив, посмотрите на std::array
или std::vector
.Если вы также используете умный указатель, например std::unique_ptr
, для хранения объектов внутри std::array
, вам не нужно беспокоиться об их удалении.
typedef std::array<std::unique_ptr<MyType>, 10> MyTypeArray;
MyTypeArray arptr;
for( MyTypeArray::iterator it = arptr.begin(), int i = 0; it != arptr.end(); ++it ) {
it->reset( new MyType( createObject(i++) ) );
}
Вам не нужно беспокоиться об удалениите, когда вы закончите, используя их.
Функция createObject(int x)
использует new
для создания объектов и возвращает указатель на это ?.В этом случае вам также необходимо удалить это, потому что в этом операторе
new MyType( createObject(i++) )
вы создаете копию объекта, возвращенного createObject
, но оригинал затем пропускается.Если вы измените createObject
также, чтобы он возвращал std::unique_ptr<MyType>
вместо необработанного указателя, вы можете предотвратить утечку.
Если createObject
создает объекты в стеке и возвращает их по значению, приведенное вышеработать правильно.
Если createObject
не использует new
для создания объектов, но создает их в стеке и возвращает указатели на них, ваша программа не будет работать так, как вы этого хотите, потому чтообъект стека будет уничтожен при выходе createObject
.