User Tools

Site Tools


qt:heap_versus_stack

This is an old revision of the document!


Heap or Stack?

In contrast to many modern programming languages, C++ has no automatic memory management. The traditional approach to managing dynamically allocated storage in C++ is to explicitly delete allocated memory that you no longer require. When you are dealing with large trees of objects, this can become quite tedious and the source of errors (especially memory leaks).

Qt tries to make up for this by providing automatic memory management for the objects under its domain. Qt user interfaces are almost always made up of a tree of Qt widgets, which are themselves subclasses of Qt objects (i.e., QWidgets derive from QObject). Qt automates the destruction of such trees: deleting the root of a tree of Qt objects will automatically delete all children of the root as well. So, managing the destruction of a large Qt interface requires only destroying the root object.

For this to work, there are two requirements:

  1. All child objects must be created on the heap; however, The root itself may be on the stack. (If you need a reminder, the heap is the memory store from which dynamically allocated storage is taken; the stack is used for standard variable storage as well as for passing values to functions, etc.) In other words, objects that you intend to place in the tree must be created dynamically (using new). Often, you will create a pointer as well to point to the newly created child.
  2. Child objects must explicitly be made children of their parents (i.e., they must be reparented). Constructors for (re)parentable Qt objects let you pass parameters to specify the parent.

Example:

QObjectSubclass theParent;                              // create theParent on the stack
 
AnotherQObjectSubclass *foo;
foo = new AnotherQObjectSubclass( "foo", &theParent );  // create foo on the heap and reparent to theParent

Automatic Management with Layout Managers

When widgets are added to layout managers, they are automatically reparented to FIXME (the layout manager's parent)|(the layout manager). Therefore, parents are not specified when creating widgets when adding them to layout managers. However, you still must reparent the layout manager.

QWidget mainWindow;                                     // mainWindow is on the stack
QVBoxLayout* theLayout = new QVBoxLayout(&mainWindow);  // theLayout is on the heap and reparented
QLabel* aLabel = new QLabel("One");                     // aLabel is on the heap (no parent specified)
theLayout->addWidget(aLabel);                           // aLabel just needs to be added to the layout manager

FIXME What happens when layout managers are nested? Do the child managers get automatically reparented?

qt/heap_versus_stack.1291834570.txt.gz · Last modified: 2010/12/08 18:56 by mithat

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki