«Новое» ключевое слово и класс хранения

Параллельно с этим вопросом: Когда я должен использовать новое ключевое слово в 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 также куча выделена?

2

Решение

«В куче», педантично, немного неправильно. 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 выше.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]