qt — повреждение стека при копировании QMap, содержащего указатель базового класса, в переполнении стека

У меня есть следующие настройки:

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, моя программа также падает, но в другой момент с другой проблемой.

Спасибо за любые советы и подсказки.

0

Решение

Теперь я положил немного B и C на карту, чтобы получить ссылку от D, который
создает глубокую копию QMap через конструктор копирования D.

Карта копируется, но затем у вас есть две карты, указывающие на одни и те же объекты, вопрос в том, кому принадлежат эти объекты.

Было бы лучше, чтобы вы вместо хранения сырых указателей использовали shared_ptr для ваших экземпляров.

QMap<QUuid, std::shared_ptr<A>> m_map;

Также обратите внимание, что ваш метод GetMap() возвращает копию карты, а не фактическую карту, поэтому при вызове у вас появляется еще одна карта, которая сопоставляется с теми же объектами.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]