Параллельно с этим вопросом: Когда я должен использовать новое ключевое слово в C ++?
Допустим, у меня есть следующая структура кода:
class Foo{
private:
int a;
int b;
/* ect */
};
class Bar{
private:
Foo A;
/* ect */
};
int main() {
Bar *b;
b = new Bar();
// call b->methods()
delete b;
};
Я знаю по ссылке выше b
выделена куча (бесплатный магазин). Но как насчет содержания A
внутри класса b
? Можно ли предположить A
также куча выделена?
«В куче», педантично, немного неправильно. C ++ не диктует использование кучи, только объекты, которые выделяются с использованием new
размещаются на неуказанном «бесплатном магазине». Тем не мение…
Да, если B
имеет переменную-член типа A
и вы создаете B
с помощью new
тогда весь этот объект находится в бесплатном магазине.
Однако важно отметить, что когда вы делаете:
B* b = new B;
b
сам не в свободном хранилище, а скорее в автоматической переменной (то есть «в стеке»). вещь, которая b
указывает на находится в свободном магазине. Автоматические переменные уничтожаются, когда они выходят из области видимости — но вещь b
Точек на этот случай не будет. Если вы этого не сделаете delete b;
Вы получите утечку памяти.
Это может сбивать с толку и показаться неважным. Может быть, это сбивает с толку, но это не так уж важно. Дело в том, что b
Это автоматическая переменная, которая указывает на что-то в бесплатном магазине, делает возможным очень важную идиому, известную как RAII, которая используется для таких вещей, как умные указатели.
shared_ptr<B> b(new B);
b
Здесь все еще автоматическая переменная. Но когда b
выходит за рамки и уничтожается, он берет вещь b
указывает на это. Использование интеллектуальных указателей здесь поможет устранить утечку памяти, созданную, когда вы этого не сделали delete b
выше.
Других решений пока нет …