Быстрый вопрос; Я уже много раз встречался и нашел ответы, но я немного параноик, поэтому хочу быть уверенным.C++ освобождает всю память, используемую структурой
Рассмотрим такую ситуацию:
struct CoordLocation
{
float X;
float Y;
float Z;
};
int main()
{
CoordLocation *coord = new CoordLocation();
delete coord;
return 0;
}
Будет призывающую удалить также очистить память, используемую в полях X, Y, Z? В некоторых ответах, которые я нашел, упоминалось, что я просто удалю POINTER, а не объект, на который ссылается этот объект. Что делать, если ...
struct CoordLocation
{
float *X;
float *Y;
float *Z;
};
int main()
{
CoordLocation *coord = new CoordLocation();
delete coord;
return 0;
}
А что, если я вручную освободить память для каждого объекта внутри структуры в конструктор/деструктор?
struct CoordLocation
{
CoordLocation()
{
*X = new float;
*Y = new float;
*Z = new float;
}
~CoordLocation()
{
delete X; delete Y; delete Z;
}
float *X;
float *Y;
float *Z;
};
int main()
{
CoordLocation *coord = new CoordLocation();
delete coord;
return 0;
}
Я заметил, что для простой ситуации, такие как:
float *a = new float;
*a = 5.0f;
printf("%f", *a);
delete a;
printf("%f", &a);
Printf напечатает 5.0, так что переменная, на которую указывает не совсем разрушен.
Итак, мой вопрос: Как я могу надежно освобождать (как в случае утечек памяти) ВСЕ память, используемая структурой в этом случае?
struct CoordLocation
{
float X;
float Y;
float Z;
};
int main()
{
CoordLocation *coord = new CoordLocation();
delete coord;
return 0;
}
Спасибо!
Ваш второй 'printf' является немного неправильным (идентификатор формата не соответствует типу аргумента). Вы действительно хотели написать 'printf ("% f ", * a);', как в первом 'printf'? –
Если вы используете недавний/современный компилятор, самым надежным способом гарантировать, что ** новая ** исправленная память будет удалена правильно, - использовать один из «умных» типов указателей, доступных в стандартной библиотеке C++. std :: unique_ptr и std :: shared_ptr получают полное право собственности на новый объект и гарантируют, что объект, за который они несут ответственность, не будет просочиться. (В идеале у вас никогда не будет указателей _raw_ в любом месте вашего кода) –
Спасибо за подсказку на unique_ptr. Я работаю с Visual C++ 2008, поэтому компилятор не поддерживает новый стандарт (не может найти unique_ptr в пространстве имен std). Я поеду со старыми способами, по крайней мере, до тех пор, пока это не произойдет позже. –