我正在玩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在堆中分配它的元素。
答案 0 :(得分:3)
我认为原因是QList
将其元素内部存储在void*
指针中,而std::list
将使用其分配器来忽略新的操作符覆盖。