Memory free
-
@Joe-von-Habsburg
OK, but you never said what type yoursth
is. If it's not aQObject *
you cannot calldeleteLater()
on it anyway. If it is, anddeleteLater()
fails to delete it, then (presumably) you do not allow return to the top-level Qt event loop after you have called it: don't know where/when your destructor is called.@JonB said in Memory free:
sth
some sth was QObject, some sth was kind of list (QVector<double> *). My opinion, I cleared list when I delete MyClass, but they took the memory and did not release.
// did not work ~MyClass(){ sthPointer->deleteLater(); sthPointer = nullptr; sthList->clear(); sthList = nullptr; } //Work ~MyClass(){ sthPointer->deleteLater(); sthPointer = nullptr; delete sthList; }
-
@JonB said in Memory free:
sth
some sth was QObject, some sth was kind of list (QVector<double> *). My opinion, I cleared list when I delete MyClass, but they took the memory and did not release.
// did not work ~MyClass(){ sthPointer->deleteLater(); sthPointer = nullptr; sthList->clear(); sthList = nullptr; } //Work ~MyClass(){ sthPointer->deleteLater(); sthPointer = nullptr; delete sthList; }
@Joe-von-Habsburg said in Memory free:
I cleared list when I delete MyClass, but they took the memory and did not release.
Which is basic c++. Why do you create the container on the heap at all? That's unusual, not needed and error prone as you can see.
-
@Joe-von-Habsburg said in Memory free:
I cleared list when I delete MyClass, but they took the memory and did not release.
Which is basic c++. Why do you create the container on the heap at all? That's unusual, not needed and error prone as you can see.
@Christian-Ehrlicher said in Memory free:
Which is basic c++. Why do you create the container on the heap at all? That's unusual, not needed and error prone as you can see.
I have 2 thing. Firstly a class => MyClass
Secondly => ClassController (another QObject)My system like that:
//MyClass class MyClass : QObject{ MyClass(){ someThingPointer = new SomeThingPointer ; someThingList = new SomeThingList<double>; }; ~MyClass(){ someThingPointer->deleteLater(); delete someThingList ; }; void doSth(); private : SomeThingPointer *someThingPointer; SomeThingList<double> *someThingList; } //ClassController class ClassController: QObject{ ClassController(); ~ClassController(); void run(); public slots: void addNew(); void deleteLast(); private : QList<MyClass *> myClasses; } //MainWindow void on_add_click(){ emit addNew(); } void on_delete_click(){ emit deleteLast(); }
Where should I create new list? I create in constructer
@Christian-Ehrlicher said in Memory free:
Why do you create the container on the heap at all?
What do you mean by that? Can you explain?
-
@Christian-Ehrlicher said in Memory free:
Which is basic c++. Why do you create the container on the heap at all? That's unusual, not needed and error prone as you can see.
I have 2 thing. Firstly a class => MyClass
Secondly => ClassController (another QObject)My system like that:
//MyClass class MyClass : QObject{ MyClass(){ someThingPointer = new SomeThingPointer ; someThingList = new SomeThingList<double>; }; ~MyClass(){ someThingPointer->deleteLater(); delete someThingList ; }; void doSth(); private : SomeThingPointer *someThingPointer; SomeThingList<double> *someThingList; } //ClassController class ClassController: QObject{ ClassController(); ~ClassController(); void run(); public slots: void addNew(); void deleteLast(); private : QList<MyClass *> myClasses; } //MainWindow void on_add_click(){ emit addNew(); } void on_delete_click(){ emit deleteLast(); }
Where should I create new list? I create in constructer
@Christian-Ehrlicher said in Memory free:
Why do you create the container on the heap at all?
What do you mean by that? Can you explain?
@Joe-von-Habsburg said in Memory free:
What do you mean by that? Can you explain?
Basic C++ stuff:
// This creates a member variable which is a pointer to a list // If you then do someThingList = new ... you allocate memory on the heap SomeThingList<double> *someThingList;
And the question was: why do you allocate someThingList on the heap? So, why is someThingList a pointer and not simply:
SomeThingList<double> someThingList;
Don't use pointers if they are not really needed...
-
@Joe-von-Habsburg said in Memory free:
What do you mean by that? Can you explain?
Basic C++ stuff:
// This creates a member variable which is a pointer to a list // If you then do someThingList = new ... you allocate memory on the heap SomeThingList<double> *someThingList;
And the question was: why do you allocate someThingList on the heap? So, why is someThingList a pointer and not simply:
SomeThingList<double> someThingList;
Don't use pointers if they are not really needed...
@jsulm said in Memory free:
Don't use pointers if they are not really needed...
Because I couldn't change the indexes. When I first created this class for the first time, it was simple (no pointers). But then I realized that I can't change the indexes.
void run(){ for(int i = 0; i < myClasses.size(); i++){ MyClass *mc = myClasses.at(i); mc->someThingList()[25] = 10000; } }
Do you have an advice?
-
@jsulm said in Memory free:
Don't use pointers if they are not really needed...
Because I couldn't change the indexes. When I first created this class for the first time, it was simple (no pointers). But then I realized that I can't change the indexes.
void run(){ for(int i = 0; i < myClasses.size(); i++){ MyClass *mc = myClasses.at(i); mc->someThingList()[25] = 10000; } }
Do you have an advice?
@Joe-von-Habsburg said in Memory free:
Because I couldn't change the indexes.
What does this have to do with pointers?
This should work just fine (don't know why you put () there):mc->someThingList[25] = 10000;
But as far as I can see you did not explain what SomeThingList is exactly.
-
@Joe-von-Habsburg said in Memory free:
Because I couldn't change the indexes.
What does this have to do with pointers?
This should work just fine (don't know why you put () there):mc->someThingList[25] = 10000;
But as far as I can see you did not explain what SomeThingList is exactly.
@jsulm said in Memory free:
don't know why you put () there
because it is private and access with getter.
@jsulm said in Memory free:
What does this have to do with pointers?
It could not work, but I will try again for you :)
Thanks for eveything
@jsulm said in Memory free:
What does this have to do with pointers?
I tested. for example :
for(int i = 0; i < myClasses.size(); i++){ MyClass *mc = myClasses.at(i); for(int j = 0; j < size; j++){ mc ->myList().append(x); } qDebug() << mc ->myList().size(); // 0 }
I can't add new data to mc ->myList() in classcontroller
-
@jsulm said in Memory free:
don't know why you put () there
because it is private and access with getter.
@jsulm said in Memory free:
What does this have to do with pointers?
It could not work, but I will try again for you :)
Thanks for eveything
@jsulm said in Memory free:
What does this have to do with pointers?
I tested. for example :
for(int i = 0; i < myClasses.size(); i++){ MyClass *mc = myClasses.at(i); for(int j = 0; j < size; j++){ mc ->myList().append(x); } qDebug() << mc ->myList().size(); // 0 }
I can't add new data to mc ->myList() in classcontroller
@Joe-von-Habsburg said in Memory free:
qDebug() << mc ->myList().size(); // 0
If you mean size() returns 0 then this simply means that size variable has 0 as value, so the inner for loop is never executed. Another explanation would be that myList() returns a COPY of the container, so you add to the copy (it should either return pointer to the container or reference). Again, has nothing to do with pointers...
-
@Joe-von-Habsburg said in Memory free:
qDebug() << mc ->myList().size(); // 0
If you mean size() returns 0 then this simply means that size variable has 0 as value, so the inner for loop is never executed. Another explanation would be that myList() returns a COPY of the container, so you add to the copy (it should either return pointer to the container or reference). Again, has nothing to do with pointers...
@jsulm said in Memory free:
so the inner for loop is never executed. Another explanation would be that myList() returns a COPY of the container, so you add to the copy (it should either return pointer to the container or reference). Again, has nothing to do with pointers...
how can I append new data to my list ? when I use pointer list, its work, but if do not use pointer, I can not append new data
@SimonSchroeder said in Memory free:
it will create a copy that is returned and you'll only change the copy. With a reference you'll change the underlying list:
thank you
-
@jsulm said in Memory free:
don't know why you put () there
because it is private and access with getter.
@jsulm said in Memory free:
What does this have to do with pointers?
It could not work, but I will try again for you :)
Thanks for eveything
@jsulm said in Memory free:
What does this have to do with pointers?
I tested. for example :
for(int i = 0; i < myClasses.size(); i++){ MyClass *mc = myClasses.at(i); for(int j = 0; j < size; j++){ mc ->myList().append(x); } qDebug() << mc ->myList().size(); // 0 }
I can't add new data to mc ->myList() in classcontroller
@Joe-von-Habsburg said in Memory free:
I can't add new data to mc ->myList() in classcontroller
You need to make sure that
MyClass::myList()
returns a reference to the list. If you have something like:class MyClass { //... SomeThingList<double> myList() { return someThingList; } }
it will create a copy that is returned and you'll only change the copy. With a reference you'll change the underlying list:
class MyClass { //... SomeThingList<double>& myList() { return someThingList; } }
-
@jsulm said in Memory free:
so the inner for loop is never executed. Another explanation would be that myList() returns a COPY of the container, so you add to the copy (it should either return pointer to the container or reference). Again, has nothing to do with pointers...
how can I append new data to my list ? when I use pointer list, its work, but if do not use pointer, I can not append new data
@SimonSchroeder said in Memory free:
it will create a copy that is returned and you'll only change the copy. With a reference you'll change the underlying list:
thank you
@Joe-von-Habsburg You should really learn C++.
See what @SimonSchroeder wrote...