Я играю с 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 размещает свои элементы в куче.
warning: deleting ‘void*’ is undefined
. - person lpapp   schedule 25.12.2014May be you forgot to include all necessary includes?
- ›Нет, это предупреждение не имеет ничего общего с включениями. Кроме того, какое отношение QApplication и QtNetwork имеют к списку или даже ко всему модулю QtCore? - person lpapp   schedule 25.12.2014int main(int argc, char *argv[])
. Кроме того, не включайте весь основной модуль, особенно сейчас, без использования QList. Вы также можете заменить qDebug на std :: cout, чтобы сделать его полностью стандартной проблемой. - person lpapp   schedule 25.12.2014QList
- это разновидность динамического массива, аstd::list
- связанный список. Это очень разные структуры данных, даже несмотря на то, что есть несколько перекрывающихся вариантов использования, в которых вы могли бы разумно использовать любую из них (например, реализация FIFO). - person hyde   schedule 25.12.2014lstEntries.push_back(Dummy(1));
должен вызывать new Dummy () `. Это не обязательно так. Посмотрите здесь: en.wikipedia.org/wiki/Allocator_%28C%2B % 2B% 29 - person FoggyDay   schedule 25.12.2014