crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в оператор delete
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Iron Bug Дата 5.8.2015, 17:33
  По вектору лучше тоже перемещаться итератором:
for(vector<int*>::iterator i=a.begin();i!=a.end();i++)
    {
        delete *i;
    }



Цитата(lanz @ 5.8.2015, 16:17) *
Мне кажется одним C тут не отделаешься. Нужно понимать из чего состоит и как работает компьютер (хотя бы самый простой, например AVRка). Потом нужно понимать как разные языки доходят до "железа", как программы превращаются в исполняемые файлы и т.п.

AVRка всё же не компьютер. микроконтроллеры гораздо проще устроены. у современных компьютеров довольно сложные чипсеты, замороченные схемы прогрузки через UEFI и это начинающему вряд ли нужно понимать в деталях.
а вот цепочку превращения кода в бинарник понимать нужно в любом случае. ну и примерно о том, как код исполняется (тут тоже всё сильно зависит от архитектуры и там есть сильно разные реализации).
Quest Дата 5.8.2015, 16:49
 
Цитата(lanz @ 5.8.2015, 16:35) *
Если вектор владеет, то я бы посоветовал unique_ptr.


Спасибо за совет.

И всем спасибо за ответы. :)
lanz Дата 5.8.2015, 16:35
  Если это не целый тип, то интереснее подумать, кто будет "владеть" этими объектами. Тот и должен их удалять.
Если вектор владеет, то я бы посоветовал unique_ptr.

Цитата
может там алгоритм удаления какой быстрее или медленнее.

Профилируйте, так вам никто не скажет :lol:
Quest Дата 5.8.2015, 16:21
  lanz, разумеется, указатели на целый тип я хранить не буду :) , тут просто как пример привожу. По поводу "лучше", я имел ввиду, что, может там алгоритм удаления какой быстрее или медленнее.
lanz Дата 5.8.2015, 16:14
  Зачем вам вообще хранить указатели на целые?

vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);


Цитата
И что лучше, vector::erase() или vector::clear() ?? Или разницы нет никакой ?

15 копеек, бабушка :lol:
http://www.cplusplus.com/reference/vector/vector/erase/
http://www.cplusplus.com/reference/vector/vector/clear/
Что значит "лучше"?
Quest Дата 5.8.2015, 15:58
 
Цитата(lanz @ 5.8.2015, 15:50) *
3. Для обычных указателей можно пройтись по вектору и удалить их вручную перед очисткой.


Скажите пожалуйста, такая чистка подойдет?
int main()
{

    int *x=new int(15);
    int *y=new int(11);
    int *z=new int(7);

    vector<int*> a;
    
    a.push_back(x);
    a.push_back(y);
    a.push_back(z);
    
    for(int i(0);i<a.size();i++)
    {
        int *h=a.at(i);
        delete h;
    }    
    a.clear();

    _getch();
    return 0;
}

И что лучше, 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
  просто я всё чаще вижу, что люди пытаются писать на С++, не зная основ. я всё-таки настоятельно рекомендую начинающим твёрдо освоить С, прежде чем переходить к плюсам. там и без темплейтов много чего нужно понять, прежде чем переходить к более сложным абстракциям.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 12:41