Возможный дубликат:
Правильное использование стека и кучи в C ++?
Куча против распределения стеков
Я пытаюсь понять, почему библиотека, которую я портировал с Java на C ++ (долгая и трудоемкая работа по редактированию после использования конвертера), не освобождает память, а просто взрывает виртуальную память до сбоя.
Очевидно, это связано с тем, что в Java нет GC и C ++, а алгоритмы довольно просто конвертируются в C ++.
Итак, вот мой вопрос. Где и как удалить выделенную память (Free it)? Когда у меня есть:
Matrix *mat = new Matrix(args);
Я, очевидно, должен закончить сферу с delete mat;
, Могу ли я избежать этого?
Будет использовать Matrix mat(args);
будь лучше? с точки зрения распределения памяти и освобождения?
Или используя Matrix mat = Matrix(args)
?
Где и как удалить выделенную память? (Это бесплатно)
В большинстве случаев, если вы правильно закодировали вещи, вам не нужно явно освобождать или освобождать какую-либо память. Либо использовать автоматическое распределение, либо умные указатели. В противном случае ответ на где довольно неудовлетворительно: где вам нужно, в зависимости от вашей программы. Ответ на как проще: с delete
(или же delete[]
для динамически размещаемых массивов).
… Я очевидно должен закончить область с матом удаления;
Могу ли я избежать этого?
Да, если вы используете автоматическое распределение:
Matrix mat(args);
Как правило, вы должны использовать динамически размещенные объекты, только если вам это действительно нужно. Если вы не знаете, действительно ли вам это нужно, то, вероятно, нет.
… Или используя Matrix mat = Matrix (args);
Это выполняет инициализацию копирования, и в этом контексте не дает никаких преимуществ по сравнению с Matrix mat(args);
, RHS выражения является временным Matrix
объект, который используется для копирования конструкции LHS mat
,
Вот недавний связанный пост.
Второй вариант лучше, если вы не хотите, чтобы объект жил за пределами области, в которой вы его создали.
Он автоматически освобождает ваш объект, когда заканчивается область, в отличие от опции динамической памяти, где вы должны явно помнить delete
предмет.
Хорошо для чтения:
Почему программисты на C ++ должны минимизировать использование «нового»?
Вы действительно должны понимать, как распределение памяти работает в C / C ++.
Я предлагаю вам начать с книги об этом, потому что вопрос подразумевает, что у вас нет большого опыта работы с C ++.
К данному вопросу:
Matrix *mat = new Matrix(args);
Здесь вы создаете Matrix
объект в куче, что означает, что он не привязан к областям (указатель все еще делает, конечно), и вы несете ответственность за его освобождение с помощью delete
,
Matrix mat(args);
— Здесь вы создаете объект в стеке, и он будет разрушен, когда закончится область видимости, это не доступно в Java, за исключением примитивных типов.
Что касается производительности — создание объектов в стеке не только безопаснее (автоматическое уничтожение), но и намного быстрее — память стека распределяется заранее, в дополнение к тому, что нет необходимости искать свободный блок.
При создании памяти из кучи — ваш процесс заканчивается запросом памяти у менеджера виртуальной памяти, что приводит к огромному падению производительности.
Сказав это — есть время и место для любого типа размещения — и вы должны использовать все, что лучше для вашего собственного кода — не существует «правильного» способа сделать это.