簡體   English   中英

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

[英]Where are std::list elements allocated?

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

我認為原因是QList將其元素內部存儲在void*指針中,而std::list將使用其分配器來忽略新的操作符覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM