Здравствуйте, гость ( Вход | Регистрация )
Iron Bug | Дата 5.8.2015, 17:33 |
По вектору лучше тоже перемещаться итератором:
Мне кажется одним C тут не отделаешься. Нужно понимать из чего состоит и как работает компьютер (хотя бы самый простой, например AVRка). Потом нужно понимать как разные языки доходят до "железа", как программы превращаются в исполняемые файлы и т.п. AVRка всё же не компьютер. микроконтроллеры гораздо проще устроены. у современных компьютеров довольно сложные чипсеты, замороченные схемы прогрузки через UEFI и это начинающему вряд ли нужно понимать в деталях. а вот цепочку превращения кода в бинарник понимать нужно в любом случае. ну и примерно о том, как код исполняется (тут тоже всё сильно зависит от архитектуры и там есть сильно разные реализации). |
|
Quest | Дата 5.8.2015, 16:49 |
Если вектор владеет, то я бы посоветовал unique_ptr. Спасибо за совет. И всем спасибо за ответы. |
|
lanz | Дата 5.8.2015, 16:35 |
Если это не целый тип, то интереснее подумать, кто будет "владеть" этими объектами. Тот и должен их удалять. Если вектор владеет, то я бы посоветовал unique_ptr. Цитата может там алгоритм удаления какой быстрее или медленнее. Профилируйте, так вам никто не скажет |
|
Quest | Дата 5.8.2015, 16:21 |
lanz, разумеется, указатели на целый тип я хранить не буду , тут просто как пример привожу. По поводу "лучше", я имел ввиду, что, может там алгоритм удаления какой быстрее или медленнее. |
|
lanz | Дата 5.8.2015, 16:14 |
Зачем вам вообще хранить указатели на целые?
Цитата И что лучше, vector::erase() или vector::clear() ?? Или разницы нет никакой ? 15 копеек, бабушка http://www.cplusplus.com/reference/vector/vector/erase/ http://www.cplusplus.com/reference/vector/vector/clear/ Что значит "лучше"? |
|
Quest | Дата 5.8.2015, 15:58 |
3. Для обычных указателей можно пройтись по вектору и удалить их вручную перед очисткой. Скажите пожалуйста, такая чистка подойдет?
И что лучше, vector::erase() или vector::clear() ?? Или разницы нет никакой ? |
|
lanz | Дата 5.8.2015, 15:50 |
1. std::string сам следит за своей памятью, его трогать не надо (конечно только в том случае если в контейнере хранятся значения, а не указатели string*). 2. QPushButton и вообще наследники QObject имеют параметр конструктора parent, который позволяет задать того кто будет следить за их удалением, перед удалением parent удалится дочерний QObject. http://doc.qt.io/qt-5/qobject.html#QObject http://doc.qt.io/qt-5/objecttrees.html 3. Для обычных указателей можно пройтись по вектору и удалить их вручную перед очисткой. 4. Можно использовать "умные" указатели, например shared_ptr и unique_ptr. http://en.cppreference.com/w/cpp/memory/unique_ptr http://en.cppreference.com/w/cpp/memory/shared_ptr |
|
Quest | Дата 5.8.2015, 15:23 |
Спасибо большое за ответы, особенно Iron Bug. Я так и думал, что удаляя указатель ( delete h; ), удаляется только объект на который он ссылается, а адрес остается, хотя он уже пустой. А как тогда можно безопасно удалить контейнер объектов с выделенной динамически памятью ? К примеру объекты string или QPushButton (Qt). Ведь метод vector::erase() или vector::clear() просто очищают контейнер ? А освобождение памяти как тогда ? |
|
lanz | Дата 5.8.2015, 14:17 |
Мне кажется одним C тут не отделаешься. Нужно понимать из чего состоит и как работает компьютер (хотя бы самый простой, например AVRка). Потом нужно понимать как разные языки доходят до "железа", как программы превращаются в исполняемые файлы и т.п. | |
Iron Bug | Дата 5.8.2015, 11:47 |
просто я всё чаще вижу, что люди пытаются писать на С++, не зная основ. я всё-таки настоятельно рекомендую начинающим твёрдо освоить С, прежде чем переходить к плюсам. там и без темплейтов много чего нужно понять, прежде чем переходить к более сложным абстракциям. | |
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 24.4.2024, 13:47 |