1. C++ memory management mechanism
C++ language provides a variety of memory management methods, mainly includingStackandHeapTwo modes.
1. Stack memory
The stack memory is automatically allocated and released by the compiler and is mainly used for storage.Local variables, function parameterswait.
The characteristics of the stack areFast and efficient, but it has limited storage space and is usually suitable for variables with shorter life cycles.
Example:
void example() { int a = 10; //Stack memory allocation} // After the function is executed,variable a Automatic release
In this example,a
In the functionexample()
It will be automatically destroyed after execution, and programmers do not need to manage manually.
Advantages of stack:
- Fast speed, because it is continuous memory space.
- Automatic management, After the variables are out of scope, the system will automatically recycle them without manual release.
Disadvantages of the stack:
- Limited capacity, usually only about 1MB, suitable for small data storage.
- Not applicable for dynamic allocation, cannot flexibly adjust the memory size.
2. Heap (Heap) memory
Heap memory is manually allocated and released by programmers and is suitable forBig data storageorRequires data across multiple function scopes。
In C++, we usenew
anddelete
Carry out heap memory management.
Example:
void example() { int* p = new int(10); // Allocate memory on the heap delete p; // Free up memory to avoid leakage}
If the programmer forgetsdelete p;
, then this memory willNever recycle,lead toMemory leak。
Advantages of pile:
- Dynamically allocated, you can apply for large chunks of memory as needed.
- Long life cycle, will not be released because the function ends, and is suitable for long-term stored data.
Disadvantages of the heap:
- Access speed is slower than stack, because the heap memory is fragmented and not continuous like the stack.
-
Memory leaks are prone to occur, if you forget
delete
, which will cause the program to consume continuously to increase the memory.
3. C++ solution to memory leaks
To solve manualnew/delete
BringedMemory leakProblem, C++11 has introducedSmart pointer(Smart Pointers), they can automatically manage the life cycle of objects.
-
std::unique_ptr
: Exclusive ownership, automatically released beyond the scope. -
std::shared_ptr
: Multiple shared ownership, released when the reference count is 0. -
std::weak_ptr
:avoidshared_ptr
Circular reference problem.
Example:
#include <memory> void example() { std::unique_ptr<int> ptr = std::make_unique<int>(10); } // After leaving scope,ptr Automatic release,No manual delete
Advantages of smart pointers:
- Avoid memory leaks, the smart pointer will automatically release memory at the right time.
- Improve code security, prevent wild pointer problems.
2. Qt's memory management mechanism
The Qt framework provides a more intelligent memory management method, avoiding the need for manual C++new/delete
Troubles of Qt's memory management mainly depends onQObject mechanismandSmart pointer。
1. Parent-son management mechanism of QObject
In Qt, most UI components (e.g.QWidget
、QPushButton
) are inherited fromQObject
, they canAutomatically manage the life cycle of subobjects。
Example:
#include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget* parent = new QWidget(); QPushButton* button = new QPushButton("Click Me", parent); // Set parent delete parent; // When parent is deleted, the button will also be automatically deleted return 0; }
In this example, we manuallydelete parent;
,butbutton
Will not leakbecause it isparent
Qt will automatically recycle the child object of .
Advantages of the father-son mechanism:
- Avoid manually delete, Qt will automatically recycle child objects.
- Improve code robustness, reduce the possibility of program crash.
2. Qt's smart pointer
Qt also provides some smart pointers to manage object lifecycle:
-
QScopedPointer
: Similar tostd::unique_ptr
, automatically releases the object at the end of the scope. -
QSharedPointer
:similarstd::shared_ptr
, supports reference counting. -
QWeakPointer
:avoidQSharedPointer
Circular reference problem.
Example:
#include <QScopedPointer> void example() { QScopedPointer<QObject> obj(new QObject()); // Automatically release at the end of the scope}
3. Qt's deleteLater() mechanism
In Qt, some objects cannot be deleted immediately, such as those that are executing a task.QObject
. Qt providesdeleteLater()
Method, let the object inWhen the event loop is idleAutomatic release.
Example:
QObject* obj = new QObject(); obj->deleteLater(); // Qt The event loop will delete the object at the appropriate time
Advantages of deleteLater():
- Avoid wild pointer problems, the object will not be deleted immediately.
- Improve stability, prevents incorrect access to deleted objects.
3. Comparison between C++ and Qt memory management
mechanism |
C++ |
Qt |
---|---|---|
Automatic management | Stack variables (automatic recycling) |
QObject Father-son relationship |
Manual management | new/delete | deleteLater() |
Prevent leakage | Smart pointer (unique_ptr, shared_ptr) |
QScopedPointer 、QPointer |
Dynamic allocation | new (must be released manually) |
new QObject(parent) (Automatic management) |
Experience:
- C++ requires programmers to manually
delete
, Qt byQObject
Automatic memory management。 - C++ bySmart pointerSolve leaks, Qt also provides a similar
QScopedPointer
。 - Qt's
deleteLater()
The mechanism makes memory management more secure and prevents crashes caused by immediate deletion.
Summarize
If you are using **pure C++**, you need to manage it yourselfnew/delete
, can useSmart pointerto reduce leakage problems. But if you are usingQt, try to make use ofQObject
ofFather-son mechanism, so there is no need to manually manage memory.
Qt's memory management makes development moreSafe, stable and easy to maintainThis is compared to traditional C++ memory managementThe biggest advantage。
The above is personal experience. I hope you can give you a reference and I hope you can support me more.