std :: list元素在哪里分配?

时间:2014-12-25 08:40:50

标签: c++ qt std qtcore stdlist

我正在玩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在堆中分配它的元素。

1 个答案:

答案 0 :(得分:3)

我认为原因是QList将其元素内部存储在void*指针中,而std::list将使用其分配器来忽略新的操作符覆盖。