У меня есть следующие настройки:
class A {
public:
A();
virtual ~A();
A(const A&other) {*this = other;}
A& operator=(const A&) {/*assigne reference members, create new of pointer members*/}
/* some other stuff */
}
class B : public A {
public:
B();
virtual ~B();
B(const B&other) {*this = other;}
B& operator=(const B&rhs) { A::operator=(rhs); /*assigne reference members, create new of pointer members*/}
/* some other stuff */
}
class C : public A {
public:
C();
virtual ~C();
C(const C&other) {*this = other;}
C& operator=(const C&) { A::operator=(rhs); /*assigne reference members, create new of pointer members*/}
/* some other stuff */
}class D {
public:
D();
virtual ~D();
D(const D&other) {*this = other;}
D& operator=(const D&rhs) {
/* iterate through map and create new instances of B or C */
m_list = rhs.m_list;
}
QMap<QUuid, A*> GetMap() {return m_map;}
QList<QUuid> GetList {return m_list;}
private:
QMap<QUuid, A*> m_map;
QList<QUuid> m_list;
/* some other stuff */
}
Теперь я поставил некоторые В а также С в карту получить ссылку от D который создает глубокую копию QMap через DКопируй конструктор. Если я пытаюсь получить размер QMap, он работает, но список поврежден. С помощью отладчика я выяснил, что QList в D повреждается, когда оператор присваивания QMap вызывает std :: swap. Мне совершенно непонятно, что там происходит с моей памятью.
Это как-то связано с выводом и использованием указателя на базовый класс? Если я изменяю QMap на std :: map, моя программа также падает, но в другой момент с другой проблемой.
Спасибо за любые советы и подсказки.
Теперь я положил немного B и C на карту, чтобы получить ссылку от D, который
создает глубокую копию QMap через конструктор копирования D.
Карта копируется, но затем у вас есть две карты, указывающие на одни и те же объекты, вопрос в том, кому принадлежат эти объекты.
Было бы лучше, чтобы вы вместо хранения сырых указателей использовали shared_ptr для ваших экземпляров.
QMap<QUuid, std::shared_ptr<A>> m_map;
Также обратите внимание, что ваш метод GetMap()
возвращает копию карты, а не фактическую карту, поэтому при вызове у вас появляется еще одна карта, которая сопоставляется с теми же объектами.
Других решений пока нет …