Где будет выделена память в следующем фрагменте кода?
Если я объявлю std::vector<A *>
где будет выделяться память? я знаю new
динамически выделяет память, но память для вектора должна выделяться статически. Я хочу знать, что происходит с памятью.
typedef std::vector<A *> AArray;
void myFunction()
{
AArray aarray;
aarray.push_back(new A());
aarray.push_back(new A());
}
3 ответа
AArray aarray;
выделит память в стеке для вашего вектора.
aarray.push_back(new A());
Построим A
в куче, а затем верните указатель на него, который будет помещен в ваш контейнер.
std::vector
должен иметь возможность изменять свои выделенные данные, что означает, что он будет хранить выделенный массив (в данном случае (A*)[]) внутри. Этот массив будет размещен в куче (динамически).
Это приведет к утечке памяти каждый раз myFunction()
называется. Переменная aarray
является локальным для myFunction()
и назначается статически, следовательно, он уничтожается, как только элемент управления возвращается из функции. Тем не менее, два объекта класса A
создаются динамически и не уничтожаются автоматически C++. Вы должны использовать delete
удалить эти объекты. Вы не удалили объекты в своем коде, поэтому эти два объекта останутся без ссылок в памяти, что приведет к утечке памяти.