Где размещены элементы std :: list?

Я играю с std :: list, чтобы понять, как он хранит элементы. Я написал следующий код, чтобы проверить, где расположены элементы.

#include <QtCore>
#include <list>

class Dummy
{
public:
    Dummy(int i) : _i(i){qDebug() << _i << " created";}
    Dummy(const Dummy& copy) : _i(copy._i) {qDebug() << _i << " copied";}
    ~Dummy() {qDebug() << _i << " destructed";}

    void* operator new (std::size_t size)
    {
        qDebug() << "Object newed";
        return ::operator new(size);
    }

    void* operator new (std::size_t size, void* ptr)
    {
        qDebug() << "Object newed 2";
        return ::operator new(size, ptr);
    }

    void* operator new (std::size_t size, const std::nothrow_t& nothrow_value)
    {
        qDebug() << "Object newed 3";
        return ::operator new(size, nothrow_value);
    }

    void* operator new[](std::size_t size)
    {
        qDebug() << "Object array newed";
        return ::operator new[](size);
    }

    void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_value)
    {
        qDebug() << "Object array newed 2";
        return ::operator new[](size, nothrow_value);
    }

    void* operator new[] (std::size_t size, void* ptr)
    {
        qDebug() << "Object array newed 3";
        return ::operator new[](size, ptr);
    }

    void operator delete(void* dptr)
    {
        qDebug() << "Object deleted";
        ::operator delete(dptr);
    }

    void operator delete[](void* dptr)
    {
        qDebug() << "Object array deleted";
        ::operator delete[](dptr);
    }

    int _i;
};


int main(int argc, char *argv[])
{
    std::list<Dummy> lstEntries;
    lstEntries.push_back(Dummy(1));
    lstEntries.push_back(Dummy(2));

    std::list<Dummy> newList;
    lstEntries = newList;

    return 0;
}

Ни одно из моих переопределений оператора не вызывается, когда я вставляю элементы в список. Это почему? Разве список не размещает элементы в куче? Или я пропустил правильный новый оператор, который список использует для выделения объектов?

Если я использую QList (Qt) вместо std :: list, вызывается void * operator new (std :: size_t size). Похоже, QList размещает свои элементы в куче.


person Lahiru Chandima    schedule 25.12.2014    source источник
comment
Это не вопрос Qt, не так ли? В любом случае ваш код неверен: warning: deleting ‘void*’ is undefined.   -  person lpapp    schedule 25.12.2014
comment
Контейнеры стандартной библиотеки используют распределитель. en.cppreference.com/w/cpp/container/list en.cppreference.com/w/cpp/memory/allocator   -  person Retired Ninja    schedule 25.12.2014
comment
Я использовал только тег Qt, потому что я тоже использовал QList вместо std :: list   -  person Lahiru Chandima    schedule 25.12.2014
comment
Не могли бы вы предоставить SSCCE? Ваш код сломан, он даже не компилируется.   -  person lpapp    schedule 25.12.2014
comment
Может, вы забыли включить все необходимое? Я добавил сюда свои включения. Вы можете удалить конструкторы и операторы удаления, чтобы сделать код немного короче.   -  person Lahiru Chandima    schedule 25.12.2014
comment
May be you forgot to include all necessary includes? - ›Нет, это предупреждение не имеет ничего общего с включениями. Кроме того, какое отношение QApplication и QtNetwork имеют к списку или даже ко всему модулю QtCore?   -  person lpapp    schedule 25.12.2014
comment
На самом деле мой код не компилируется без #include ‹QApplication›. ‹QtNetwork› не требуется. Я удалил это. Я тоже получаю предупреждения, но это компилируется   -  person Lahiru Chandima    schedule 25.12.2014
comment
Нет-нет-нет, я писал, почему вы даже используете QApplication для этого, особенно без запуска цикла событий или использования его для чего-либо, особенно с основными вещами, почему графический интерфейс, почему приложение, почему это? Это действительно связано с проблемой?   -  person lpapp    schedule 25.12.2014
comment
да. ты прав. Они принадлежали им, потому что я написал это, изменив существующий код, который делал что-то еще. Я удалил эти ненужные предметы   -  person Lahiru Chandima    schedule 25.12.2014
comment
Но если вы удалите это, вам также придется удалить эти ненужные переменные! int main(int argc, char *argv[]). Кроме того, не включайте весь основной модуль, особенно сейчас, без использования QList. Вы также можете заменить qDebug на std :: cout, чтобы сделать его полностью стандартной проблемой.   -  person lpapp    schedule 25.12.2014
comment
Обратите внимание, что QList - это разновидность динамического массива, а std::list - связанный список. Это очень разные структуры данных, даже несмотря на то, что есть несколько перекрывающихся вариантов использования, в которых вы могли бы разумно использовать любую из них (например, реализация FIFO).   -  person hyde    schedule 25.12.2014
comment
Я думаю, вы предполагаете, что lstEntries.push_back(Dummy(1)); должен вызывать new Dummy () `. Это не обязательно так. Посмотрите здесь: en.wikipedia.org/wiki/Allocator_%28C%2B % 2B% 29   -  person FoggyDay    schedule 25.12.2014


Ответы (1)


Я думаю, причина в том, что QList хранит свои элементы внутри указателя void*, тогда как std::list будет использовать свой распределитель для всего этого, не обращая внимания на переопределение вашего нового оператора.

person lpapp    schedule 25.12.2014
comment
Дополнительная информация: void* operator new (std::size_t size, void* ptr) будет вызываться QVector. Кроме того, не поддавайтесь соблазну, что std :: list и QList одинаковы или даже очень похожи. Первый - это связанный список, а второй - нет. - person lpapp; 25.12.2014
comment
Я забыл, что есть такая штука, как аллокаторы. Спасибо что подметил это - person Lahiru Chandima; 25.12.2014