указатели — в чем разница — разумное распределение памяти — между объектами Mat (args); и Object * Mat = new Mat (args); в С ++?

Возможный дубликат:
Правильное использование стека и кучи в C ++?
Куча против распределения стеков

Я пытаюсь понять, почему библиотека, которую я портировал с Java на C ++ (долгая и трудоемкая работа по редактированию после использования конвертера), не освобождает память, а просто взрывает виртуальную память до сбоя.
Очевидно, это связано с тем, что в Java нет GC и C ++, а алгоритмы довольно просто конвертируются в C ++.

Итак, вот мой вопрос. Где и как удалить выделенную память (Free it)? Когда у меня есть:

Matrix *mat = new Matrix(args);

Я, очевидно, должен закончить сферу с delete mat;, Могу ли я избежать этого?
Будет использовать Matrix mat(args); будь лучше? с точки зрения распределения памяти и освобождения?
Или используя Matrix mat = Matrix(args)?

0

Решение

Где и как удалить выделенную память? (Это бесплатно)

В большинстве случаев, если вы правильно закодировали вещи, вам не нужно явно освобождать или освобождать какую-либо память. Либо использовать автоматическое распределение, либо умные указатели. В противном случае ответ на где довольно неудовлетворительно: где вам нужно, в зависимости от вашей программы. Ответ на как проще: с delete (или же delete[] для динамически размещаемых массивов).

… Я очевидно должен закончить область с матом удаления;
Могу ли я избежать этого?

Да, если вы используете автоматическое распределение:

Matrix mat(args);

Как правило, вы должны использовать динамически размещенные объекты, только если вам это действительно нужно. Если вы не знаете, действительно ли вам это нужно, то, вероятно, нет.

… Или используя Matrix mat = Matrix (args);

Это выполняет инициализацию копирования, и в этом контексте не дает никаких преимуществ по сравнению с Matrix mat(args);, RHS выражения является временным Matrix объект, который используется для копирования конструкции LHS mat,

Вот недавний связанный пост.

2

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

Второй вариант лучше, если вы не хотите, чтобы объект жил за пределами области, в которой вы его создали.

Он автоматически освобождает ваш объект, когда заканчивается область, в отличие от опции динамической памяти, где вы должны явно помнить delete предмет.

Хорошо для чтения:

Почему программисты на C ++ должны минимизировать использование «нового»?

1

Вы действительно должны понимать, как распределение памяти работает в C / C ++.
Я предлагаю вам начать с книги об этом, потому что вопрос подразумевает, что у вас нет большого опыта работы с C ++.
К данному вопросу:
Matrix *mat = new Matrix(args);
Здесь вы создаете Matrix объект в куче, что означает, что он не привязан к областям (указатель все еще делает, конечно), и вы несете ответственность за его освобождение с помощью delete,
Matrix mat(args); — Здесь вы создаете объект в стеке, и он будет разрушен, когда закончится область видимости, это не доступно в Java, за исключением примитивных типов.
Что касается производительности — создание объектов в стеке не только безопаснее (автоматическое уничтожение), но и намного быстрее — память стека распределяется заранее, в дополнение к тому, что нет необходимости искать свободный блок.
При создании памяти из кучи — ваш процесс заканчивается запросом памяти у менеджера виртуальной памяти, что приводит к огромному падению производительности.
Сказав это — есть время и место для любого типа размещения — и вы должны использовать все, что лучше для вашего собственного кода — не существует «правильного» способа сделать это.

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