LINUX.ORG.RU

освобождение памяти qt 4


0

0

есть класс (примерно такой):
class QT_UMLModel{
public:
QT_UMLModel();
void addClass(QString name);
int ClassCount;
QDomElement * ClassItem;
QDomDocument Model;
}
примерный конструктор:
QT_UMLModel::QT_UMLModel(){
ClassCount = 0;
ClassItem = new QDomElement;

}
и метод:
void QT_UMLModel::addClass(QString name){
delete ClassItem;
ClassCount++;
ClassItem = new QDomElement [ClassCount];
}
В этом случае, при вторичном вызове метода addClass происходит след ошибка: "*** glibc detected *** free(): invalid pointer: 0x00000000005a2f18 ***".

но если вместо QDomElement * ClassItem; создать QDomElement ** ClassItem; (соответственно вместо ClassItem = new QDomElement; - ClassItem = new QDomElement *; и вместо ClassItem = new QDomElement [ClassCount]; - ClassItem = new QDomElement * [ClassCount]; память освобождается на ура. к сожалению такой вариант оставить не могу, ибо при попытке сделать в этом же методе (addClass) Model.appendChild(*ClassItem[ClassCount]); прога проваливается в сегфолт (в этом случае есно, я объект Model обнулял).

Единственное рабочее решение это первый вариант с удалением строчки delete "ClassItem;" - тогда все проходит на ура. но тогда возникает опасение memory leak =( (еслиб этот метод вызывался пару раз - может и забил бы, но этот метод будет вызываться часто). Ах да, Qt 4.1.0 и g++ 4.0.2 (вариант обновить g++ пока не рассматриваются, до момента тыкания меня носом в changelog, где сказано что что-то похожее пофиксино =) )

Вотс.... хелп плиз!

★★

мда......... узнай, что такое QList........ И прочти сначал Страутрупа, а уже потом кодируй

anonymous
()

> delete ClassItem;
> ClassCount++;
> ClassItem = new QDomElement [ClassCount];

для удаления массивов надо использовать delete[]
Кстати простая замена не поможет, т.к. в конструкторе создаётся не массив. В общем пересмотрите дизайн класса.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

человека либо конкретно глючт, бывает в пятницу вечером после 10 часов работы, либо вы вообще не предстваляете, что такое укзатель, что такое new, что такое массив в c и чем он плох, и почему надо пользоваться готовыми структурами данных(QList или std::list). Может лучше сначала посмотреть какой-нибудь открытый проект, как там всё сделано, а уже потом самому что-то делать? И ещё: НУ КОГДА ЖЕ НАЧНЁТЕ ЧИТАТЬ КНИЖКИ?

anonymous
()

всем пасиб за ответы, заюзал Qlist.

по поводу книжек - читаю, но опыт над нарабатывать, в том числе и на шишках в виде сегфолтов. свои "шишки" более памятны =)

ale ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.