Memory free
-
@jsulm said in Memory free:
How long did you observe this? At some point the memory should not increase anymore.
I spammed buttons many times, Its increased. I quit program after It used 15GB Ram. My computer has 64GB ram. Is it a reason? Because It can increase? There is lots of free space.
@jsulm said in Memory free:
And as already mentioned: if you want to properly analyze memory consumption and look for memory leaks you have to use proper tools, not task manager.
What's your recomended application ? I look task manager, resource monitor and performance monitor. These are windows's applicatons.
@JonB said in Memory free:
VS/MSVC has some memory analyzer of its own.
I use QtCreator, unfortunately debug profile cant work
@Joe-von-Habsburg said in Memory free:
I use QtCreator, unfortunately debug profile cant work
I don't know if "debug profile" is what is needed, but whatever the tool is if Creator does not offer an interface to it you will presulably need to run it under that tool (however you do that) outside of Creator.
I look task manager, resource monitor and performance monitor
None of these are suitable, none can tell you what areas of memory allocated by your application might have been freed in C++ but are re-allocatable by C++ at a future point.
I quit program after It used 15GB Ram.
Since "I spammed buttons many times" could mean anything from, say, 5 to a million it's not possible to say for sure. But anything which eats GBs of memory for some pushbuttons is clearly not right.
-
@Joe-von-Habsburg said in Memory free:
I use QtCreator, unfortunately debug profile cant work
I don't know if "debug profile" is what is needed, but whatever the tool is if Creator does not offer an interface to it you will presulably need to run it under that tool (however you do that) outside of Creator.
I look task manager, resource monitor and performance monitor
None of these are suitable, none can tell you what areas of memory allocated by your application might have been freed in C++ but are re-allocatable by C++ at a future point.
I quit program after It used 15GB Ram.
Since "I spammed buttons many times" could mean anything from, say, 5 to a million it's not possible to say for sure. But anything which eats GBs of memory for some pushbuttons is clearly not right.
@JonB said in Memory free:
Since "I spammed buttons many times" could mean anything from, say, 5 to a million it's not possible to say for sure. But anything which eats GBs of memory for some pushbuttons is clearly not right.
So many times I clicked the buttons. add delete add delete add delete .... maybe a hundred times
@JonB said in Memory free:
None of these are suitable,
whats your recomended without valgrid ?
-
@Joe-von-Habsburg
Yes,deleteLater()
works. Pointer is only freed when your code allows Qt top-level event loop to be re-entered. However, C++delete
does not return memory to the OS, it only allows to be re-used in your application at a later time, so if you are looking at OS report you won't see free memory increase. Use a tool like valgrind to analyze your application for leaks.@JonB said in Memory free:
Yes, deleteLater() works.
I have another question. I do something with MyClass object in loop
void run(){ for(int i = 0; i < myClasses.size(); i++){ MyClass *mc = myClasses.at(i); mc.doSth(); } }
Is memory leak able to be for that reason ? Must I delete or do something ?
-
@JonB said in Memory free:
Since "I spammed buttons many times" could mean anything from, say, 5 to a million it's not possible to say for sure. But anything which eats GBs of memory for some pushbuttons is clearly not right.
So many times I clicked the buttons. add delete add delete add delete .... maybe a hundred times
@JonB said in Memory free:
None of these are suitable,
whats your recomended without valgrid ?
@Joe-von-Habsburg said in Memory free:
whats your recomended without valgrid ?
I answered that previously if you are using MSVC/VS under Windows. If you are using MinGW I don't know. I do not use Qt under Windows.
Is memory leak able to be for that reason ? Must I delete or do something ?
The code you show (seems to) just access an element in whatever type of collection
myClasses
is (apparently, a collection ofMyClass *
pointers). There is no "leak" here in itself. -
@JonB said in Memory free:
Yes, deleteLater() works.
I have another question. I do something with MyClass object in loop
void run(){ for(int i = 0; i < myClasses.size(); i++){ MyClass *mc = myClasses.at(i); mc.doSth(); } }
Is memory leak able to be for that reason ? Must I delete or do something ?
@Joe-von-Habsburg said in Memory free:
MyClass *mc = myClasses.at(i);
Must I delete or do something ?
Depends on how you create the objects in
myClasses
.
myClasses
is a Q-container ofQObjects
?!
If they areQObjects
and have a parent, then you don't have to do anything, because they will be deleted whenparent
is deleted. But be careful not to access the pointers in other places, if so. Always check fornullptr
or use something likeQSharedPointer
when passingQObjects
around.I would recommend you to read this:
-
@Joe-von-Habsburg said in Memory free:
MyClass *mc = myClasses.at(i);
Must I delete or do something ?
Depends on how you create the objects in
myClasses
.
myClasses
is a Q-container ofQObjects
?!
If they areQObjects
and have a parent, then you don't have to do anything, because they will be deleted whenparent
is deleted. But be careful not to access the pointers in other places, if so. Always check fornullptr
or use something likeQSharedPointer
when passingQObjects
around.I would recommend you to read this:
@Pl45m4 said in Memory free:
Depends on how you create the objects in myClasses.
I don't see how that is relevant. [Assume OP means
mc->doSth()
rather thanmc.doDoSth()
, which won't compile.] So it's just a pointer, and a method is called on it. The OP asked about memory leak or deleting because that what this topic is about, I understand what you are saying [perfectly valid advice] but just don't see how they are related. -
@Pl45m4 said in Memory free:
Depends on how you create the objects in myClasses.
I don't see how that is relevant. [Assume OP means
mc->doSth()
rather thanmc.doDoSth()
, which won't compile.] So it's just a pointer, and a method is called on it. The OP asked about memory leak or deleting because that what this topic is about, I understand what you are saying [perfectly valid advice] but just don't see how they are related.@JonB said in Memory free:
Assume OP means mc->doSth() rather than mc.doDoSth(), which won't compile.
I wasn't after that :) I've noticed it but it also doesn't matter.
Maybe the part I've quoted was a bit misleading. Fixed it.My point was, when elements in the container are
QObjects
with a parent, there is nothing to do and you don't have to delete them manually. -
@JonB said in Memory free:
Assume OP means mc->doSth() rather than mc.doDoSth(), which won't compile.
I wasn't after that :) I've noticed it but it also doesn't matter.
Maybe the part I've quoted was a bit misleading. Fixed it.My point was, when elements in the container are
QObjects
with a parent, there is nothing to do and you don't have to delete them manually.@Pl45m4 said in Memory free:
My point was, when elements in the container are QObjects with a parent, there is nothing to do and you don't have to delete them manually.
This is only partially true. In the OPs case he continuously adds and removes QObjects to a container. I would expect that the parent will live a lot longer. Thus, deleting the objects manually once they are removed from the container is a good idea. If the parent lives until the end of the program, you would never free any memory automatically. (The OP posted code for
deleteLast()
that both removes the object from the container and callsdeleteLater()
on it.)@Joe-von-Habsburg said in Memory free:
So many times I clicked the buttons. add delete add delete add delete .... maybe a hundred times
If you are are alternating between clicking add and delete, the amount of memory used should not change (you seem to be running the event loop as clicks are registered; and thus
deleteLater()
should do its job). Only clicking add repeatedly should increase memory. If you want help with your code we would need a minimal compilable example that reproduces the problem. There could be something wrong anywhere in you whole code.On Windows the best tool (at least the best tool I know) for debugging is Visual Studio. Debugging inside Qt Creator is awfully slow on Windows (the slower the larger your projects gets). With qmake-based projects you can call qmake on the command line to create a fresh VS project and run that to debug or inspect memory usage (or profile performance). With CMake-based projects you can just open them up inside VS.
-
@SimonSchroeder said in Memory free:
...
On Windows the best tool (at least the best tool I know) for debugging is Visual Studio. Debugging inside Qt Creator is awfully slow on Windows (the slower the larger your projects gets). With qmake-based projects you can call qmake on the command line to create a fresh VS project and run that to debug or inspect memory usage (or profile performance). With CMake-based projects you can just open them up inside VS.I have the same opinion about Visual Studio C++. Even though I generally use mingw for my projects on Windows, I always use Visual Studio C++ for debugging.
I once took the trouble to write a "Memory Leak Indicator" for "new/delete" that shows the file name and line number in which an object that has not been released was instantiated. I like using it with Qt because I still work a lot with pointers there. -
@Pl45m4 said in Memory free:
My point was, when elements in the container are QObjects with a parent, there is nothing to do and you don't have to delete them manually.
This is only partially true. In the OPs case he continuously adds and removes QObjects to a container. I would expect that the parent will live a lot longer. Thus, deleting the objects manually once they are removed from the container is a good idea. If the parent lives until the end of the program, you would never free any memory automatically. (The OP posted code for
deleteLast()
that both removes the object from the container and callsdeleteLater()
on it.)@Joe-von-Habsburg said in Memory free:
So many times I clicked the buttons. add delete add delete add delete .... maybe a hundred times
If you are are alternating between clicking add and delete, the amount of memory used should not change (you seem to be running the event loop as clicks are registered; and thus
deleteLater()
should do its job). Only clicking add repeatedly should increase memory. If you want help with your code we would need a minimal compilable example that reproduces the problem. There could be something wrong anywhere in you whole code.On Windows the best tool (at least the best tool I know) for debugging is Visual Studio. Debugging inside Qt Creator is awfully slow on Windows (the slower the larger your projects gets). With qmake-based projects you can call qmake on the command line to create a fresh VS project and run that to debug or inspect memory usage (or profile performance). With CMake-based projects you can just open them up inside VS.
@SimonSchroeder said in Memory free:
This is only partially true. In the OPs case he continuously adds and removes QObjects to a container. I would expect that the parent will live a lot longer. Thus, deleting the objects manually once they are removed from the container is a good idea. If the parent lives until the end of the program, you would never free any memory automatically. (The OP posted code for deleteLast() that both removes the object from the container and calls deleteLater() on it.)
Yes, and I dont want to start nitpicking... but I didn't wrote anything else :)
Of course, when you want to re-create the instance, the old one should be free'd correctly. At the very beginning @Joe-von-Habsburg also posted a snippet where he showeddeleteLater()
on a stack member inside class destructor :) -
@Joe-von-Habsburg said in Memory free:
whats your recomended without valgrid ?
I answered that previously if you are using MSVC/VS under Windows. If you are using MinGW I don't know. I do not use Qt under Windows.
Is memory leak able to be for that reason ? Must I delete or do something ?
The code you show (seems to) just access an element in whatever type of collection
myClasses
is (apparently, a collection ofMyClass *
pointers). There is no "leak" here in itself.Thanks everyone for try help me :)
@JonB said in Memory free:
I answered that previously if you are using MSVC/VS under Windows.
I use MSVC compiler with QtCreator. I do not use Visual Studio.
@JonB said in Memory free:
The code you show (seems to) just access an element in whatever type of collection myClasses is (apparently, a collection of MyClass * pointers). There is no "leak" here in itself.
Thank you for answered my possible thought.
@Pl45m4 said in Memory free:
Depends on how you create the objects in myClasses.
I create objects with click add button as pointer.
@Pl45m4 said in Memory free:
myClasses is a Q-container of QObjects?!
myClasses is QList.
QList<MyClass *> myClasses;
@Pl45m4 said in Memory free:
If they are QObjects and have a parent, then you don't have to do anything, because they will be deleted when parent is deleted.
MyClass is QObject.
class MyClass : public QObject{}
When I use delete button, I delete the last index of myClasses list. It must be deleted.
void deleteLast(){ MyClass *mc = myClasses.last(); deleteConnections(mc); mc->deleteLater(); myClasses.removeLast(); }
@Pl45m4 said in Memory free:
But be careful not to access the pointers in other places, if so. Always check for nullptr or use something like QSharedPointer when passing QObjects around.
Its assignment only deconstructer as nullptr. Should not I ?
~MyClass(){ //delete all probs like that: someThingPointer->deleteLater(); someThingPointer = nullptr; someThing.deleteLater(); }
@Pl45m4 said in Memory free:
I would recommend you to read this:
Thank you I will read.
@JonB said in Memory free:
The OP asked about memory leak or deleting because that what this topic is about, I understand what you are saying [perfectly valid advice] but just don't see how they are related.
I was just curious. by assigning an object with a pointer according to the index of the list in a loop. will using a method of that object and then not doing anything to that object after I'm done and not leaving it there cause a leak? But it won't happen.
@Pl45m4 said in Memory free:
My point was, when elements in the container are QObjects with a parent, there is nothing to do and you don't have to delete them manually.
You want to say, If I delete MyClass, all properties automaticly deleted. I don't have to do anything.
@SimonSchroeder said in Memory free:
(The OP posted code for deleteLast() that both removes the object from the container and calls deleteLater() on it.)
Yes I do it, But memory cant be free. Always increase. (deconstructer is working)
void deleteLast(){ MyClass *mc = myClasses.last(); deleteConnections(mc); mc->deleteLater(); myClasses.removeLast(); }
@SimonSchroeder said in Memory free:
If you are are alternating between clicking add and delete, the amount of memory used should not change
I tested like that : add add add remove remove remove add add add remove remove remove... (myClasses size can be min 1, max 4). But always increase. Memory cannot be free.
@SimonSchroeder said in Memory free:
If you want help with your code we would need a minimal compilable example that reproduces the problem. There could be something wrong anywhere in you whole code.
Okey, I will make basic code example and I will try.
@SimonSchroeder said in Memory free:
Debugging inside Qt Creator is awfully slow on Windows
Is driving me crazy, and I can't use the debug profile right now for some reasons..
@SimonSchroeder said in Memory free:
With CMake-based projects you can just open them up inside VS.
I work with CMake. If I open the project in VS, I don't have to anything. It will work ?
@Helmut-Jakoby said in Memory free:
I once took the trouble to write a "Memory Leak Indicator" for "new/delete" that shows the file name and line number in which an object that has not been released was instantiated.
Thank you I will look.
-
Thanks everyone for try help me :)
@JonB said in Memory free:
I answered that previously if you are using MSVC/VS under Windows.
I use MSVC compiler with QtCreator. I do not use Visual Studio.
@JonB said in Memory free:
The code you show (seems to) just access an element in whatever type of collection myClasses is (apparently, a collection of MyClass * pointers). There is no "leak" here in itself.
Thank you for answered my possible thought.
@Pl45m4 said in Memory free:
Depends on how you create the objects in myClasses.
I create objects with click add button as pointer.
@Pl45m4 said in Memory free:
myClasses is a Q-container of QObjects?!
myClasses is QList.
QList<MyClass *> myClasses;
@Pl45m4 said in Memory free:
If they are QObjects and have a parent, then you don't have to do anything, because they will be deleted when parent is deleted.
MyClass is QObject.
class MyClass : public QObject{}
When I use delete button, I delete the last index of myClasses list. It must be deleted.
void deleteLast(){ MyClass *mc = myClasses.last(); deleteConnections(mc); mc->deleteLater(); myClasses.removeLast(); }
@Pl45m4 said in Memory free:
But be careful not to access the pointers in other places, if so. Always check for nullptr or use something like QSharedPointer when passing QObjects around.
Its assignment only deconstructer as nullptr. Should not I ?
~MyClass(){ //delete all probs like that: someThingPointer->deleteLater(); someThingPointer = nullptr; someThing.deleteLater(); }
@Pl45m4 said in Memory free:
I would recommend you to read this:
Thank you I will read.
@JonB said in Memory free:
The OP asked about memory leak or deleting because that what this topic is about, I understand what you are saying [perfectly valid advice] but just don't see how they are related.
I was just curious. by assigning an object with a pointer according to the index of the list in a loop. will using a method of that object and then not doing anything to that object after I'm done and not leaving it there cause a leak? But it won't happen.
@Pl45m4 said in Memory free:
My point was, when elements in the container are QObjects with a parent, there is nothing to do and you don't have to delete them manually.
You want to say, If I delete MyClass, all properties automaticly deleted. I don't have to do anything.
@SimonSchroeder said in Memory free:
(The OP posted code for deleteLast() that both removes the object from the container and calls deleteLater() on it.)
Yes I do it, But memory cant be free. Always increase. (deconstructer is working)
void deleteLast(){ MyClass *mc = myClasses.last(); deleteConnections(mc); mc->deleteLater(); myClasses.removeLast(); }
@SimonSchroeder said in Memory free:
If you are are alternating between clicking add and delete, the amount of memory used should not change
I tested like that : add add add remove remove remove add add add remove remove remove... (myClasses size can be min 1, max 4). But always increase. Memory cannot be free.
@SimonSchroeder said in Memory free:
If you want help with your code we would need a minimal compilable example that reproduces the problem. There could be something wrong anywhere in you whole code.
Okey, I will make basic code example and I will try.
@SimonSchroeder said in Memory free:
Debugging inside Qt Creator is awfully slow on Windows
Is driving me crazy, and I can't use the debug profile right now for some reasons..
@SimonSchroeder said in Memory free:
With CMake-based projects you can just open them up inside VS.
I work with CMake. If I open the project in VS, I don't have to anything. It will work ?
@Helmut-Jakoby said in Memory free:
I once took the trouble to write a "Memory Leak Indicator" for "new/delete" that shows the file name and line number in which an object that has not been released was instantiated.
Thank you I will look.
@Joe-von-Habsburg said in Memory free:
I use MSVC compiler with QtCreator. I do not use Visual Studio.
Then as everybody has said you are going to find it very difficult to find a suitable tool/environment to use for memory usage checking under Windows.
-
Thanks everyone for try help me :)
@JonB said in Memory free:
I answered that previously if you are using MSVC/VS under Windows.
I use MSVC compiler with QtCreator. I do not use Visual Studio.
@JonB said in Memory free:
The code you show (seems to) just access an element in whatever type of collection myClasses is (apparently, a collection of MyClass * pointers). There is no "leak" here in itself.
Thank you for answered my possible thought.
@Pl45m4 said in Memory free:
Depends on how you create the objects in myClasses.
I create objects with click add button as pointer.
@Pl45m4 said in Memory free:
myClasses is a Q-container of QObjects?!
myClasses is QList.
QList<MyClass *> myClasses;
@Pl45m4 said in Memory free:
If they are QObjects and have a parent, then you don't have to do anything, because they will be deleted when parent is deleted.
MyClass is QObject.
class MyClass : public QObject{}
When I use delete button, I delete the last index of myClasses list. It must be deleted.
void deleteLast(){ MyClass *mc = myClasses.last(); deleteConnections(mc); mc->deleteLater(); myClasses.removeLast(); }
@Pl45m4 said in Memory free:
But be careful not to access the pointers in other places, if so. Always check for nullptr or use something like QSharedPointer when passing QObjects around.
Its assignment only deconstructer as nullptr. Should not I ?
~MyClass(){ //delete all probs like that: someThingPointer->deleteLater(); someThingPointer = nullptr; someThing.deleteLater(); }
@Pl45m4 said in Memory free:
I would recommend you to read this:
Thank you I will read.
@JonB said in Memory free:
The OP asked about memory leak or deleting because that what this topic is about, I understand what you are saying [perfectly valid advice] but just don't see how they are related.
I was just curious. by assigning an object with a pointer according to the index of the list in a loop. will using a method of that object and then not doing anything to that object after I'm done and not leaving it there cause a leak? But it won't happen.
@Pl45m4 said in Memory free:
My point was, when elements in the container are QObjects with a parent, there is nothing to do and you don't have to delete them manually.
You want to say, If I delete MyClass, all properties automaticly deleted. I don't have to do anything.
@SimonSchroeder said in Memory free:
(The OP posted code for deleteLast() that both removes the object from the container and calls deleteLater() on it.)
Yes I do it, But memory cant be free. Always increase. (deconstructer is working)
void deleteLast(){ MyClass *mc = myClasses.last(); deleteConnections(mc); mc->deleteLater(); myClasses.removeLast(); }
@SimonSchroeder said in Memory free:
If you are are alternating between clicking add and delete, the amount of memory used should not change
I tested like that : add add add remove remove remove add add add remove remove remove... (myClasses size can be min 1, max 4). But always increase. Memory cannot be free.
@SimonSchroeder said in Memory free:
If you want help with your code we would need a minimal compilable example that reproduces the problem. There could be something wrong anywhere in you whole code.
Okey, I will make basic code example and I will try.
@SimonSchroeder said in Memory free:
Debugging inside Qt Creator is awfully slow on Windows
Is driving me crazy, and I can't use the debug profile right now for some reasons..
@SimonSchroeder said in Memory free:
With CMake-based projects you can just open them up inside VS.
I work with CMake. If I open the project in VS, I don't have to anything. It will work ?
@Helmut-Jakoby said in Memory free:
I once took the trouble to write a "Memory Leak Indicator" for "new/delete" that shows the file name and line number in which an object that has not been released was instantiated.
Thank you I will look.
@Joe-von-Habsburg said in Memory free:
@Pl45m4 said in Memory free:
Depends on how you create the objects in myClasses.
I create objects with click add button as pointer.
Codewise... not where you click to add it to your list.
Somewhere in your code you create the object.// "this" as parent, when parent is destroyed, "myC" also cleaned up. MyClass *myC = new MyClass(this); // or MyClass *myC = new MyClass(); // no parent
As @SimonSchroeder has written above, it's diffent when deleting and re-creating
myC
multiple times, whileparent
is "alive" the whole time. Then you have to delete it yourself.
But, refering to your initial code snippet in your first post, in a destructor you dont need to do it -
@Joe-von-Habsburg said in Memory free:
@Pl45m4 said in Memory free:
Depends on how you create the objects in myClasses.
I create objects with click add button as pointer.
Codewise... not where you click to add it to your list.
Somewhere in your code you create the object.// "this" as parent, when parent is destroyed, "myC" also cleaned up. MyClass *myC = new MyClass(this); // or MyClass *myC = new MyClass(); // no parent
As @SimonSchroeder has written above, it's diffent when deleting and re-creating
myC
multiple times, whileparent
is "alive" the whole time. Then you have to delete it yourself.
But, refering to your initial code snippet in your first post, in a destructor you dont need to do it@Pl45m4 @JonB @Helmut-Jakoby @SimonSchroeder @jsulm
I solved the problem. I used deleteLater(), clear, nullptr but they did not work. I use just delete and than it works.
~MyClass(){ delete sth; }
Thanks for your helps.
-
-
@Pl45m4 @JonB @Helmut-Jakoby @SimonSchroeder @jsulm
I solved the problem. I used deleteLater(), clear, nullptr but they did not work. I use just delete and than it works.
~MyClass(){ delete sth; }
Thanks for your helps.
@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. -
@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?