Подозрения ОП вполне верны: QDomDocument
содержит указатель на свою реализацию (PIMPL) через свой базовый класс, QDomNode
.
В то время как fonZ прав, говоряисходный объект выйдет из области видимости и будет уничтожен, а копия, сохраненная на карте, сохранит (совместно используемую) реализацию.Взглянув на источник , мы увидим пустой деструктор для QDomDocument
, а его деструктор базового класса обнаружит механизм подсчета ссылок:
QDomNode::~QDomNode()
{
if (impl && !impl->ref.deref())
delete impl;
}
счет увеличивается при построении копии:
QDomNode::QDomNode(const QDomNode &n)
{
impl = n.impl;
if (impl)
impl->ref.ref();
}
, а также в присваивании:
QDomNode& QDomNode::operator=(const QDomNode &n)
{
if (n.impl)
n.impl->ref.ref();
if (impl && !impl->ref.deref())
delete impl;
impl = n.impl;
return *this;
}
, таким образом, метод A является законным и безопасным и не вызывает проблем с обработкой памяти.
Я бы также отметил, что использование QMap::insert
вместо оператора индекса немного более производительно.
Выполнение:
QDomDocument doc;
doc.setContent( &file );
docs["alpha"] = doc;
или
docs["alpha"] = QDomDocument();
docs["alpha"].setContent( &file );
оба приведут к следующему:
- объект
QDomDocument
создан (временный, во втором фрагменте) - создан еще один объект
QDomDocument
(внутри карты), вызывающий docs["alpha"]
- последний назначен первому.
Использование
docs.insert("alpha", QDomDocument());
docs["alpha"].setContent( &file );
вызовет только временный конструктор и конструктор копирования элемента карты.