-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathmemory_leaks.lyx
243 lines (201 loc) · 5.44 KB
/
memory_leaks.lyx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#LyX 2.2 created this file. For more info see http://www.lyx.org/
\lyxformat 474
\begin_document
\begin_header
\textclass article
\use_default_options true
\maintain_unincluded_children false
\language english
\language_package default
\inputencoding auto
\fontencoding global
\font_roman default
\font_sans default
\font_typewriter default
\font_math auto
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry true
\use_package amsmath 1
\use_package amssymb 1
\use_package cancel 1
\use_package esint 1
\use_package mathdots 1
\use_package mathtools 1
\use_package mhchem 1
\use_package stackrel 1
\use_package stmaryrd 1
\use_package undertilde 1
\cite_engine basic
\cite_engine_type default
\biblio_style plain
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date false
\justification true
\use_refstyle 0
\index Index
\shortcut idx
\color #008000
\end_index
\leftmargin 0.7in
\topmargin 0.7in
\rightmargin 0.7in
\bottommargin 0.7in
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\paragraph_indentation default
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\end_header
\begin_body
\begin_layout Standard
\align center
\family sans
\series bold
\size huge
Detecting and Preventing Memory Leaks
\end_layout
\begin_layout Standard
\align center
\family sans
\size larger
CS1230
\end_layout
\begin_layout Standard
\align center
\size large
\begin_inset VSpace -0.1in
\end_inset
\end_layout
\begin_layout Standard
Preventing and detecting memory leaks is a crucial part of coding in C++.
This doc describes the Valgrind Memory Analyzer, a built-in tool in QtCreator
that automatically detects memory leaks, as well as some design patterns
to keep in mind in order to prevent memory leaks from ever happening.
\end_layout
\begin_layout Section
Valgrind Memory Analyzer
\end_layout
\begin_layout Standard
Valgrind is a great tool for automatically detecting memory leaks, and it
is built in to QtCreator.
To use it, select Analyze > Valgrind Memory Analyzer.
\end_layout
\begin_layout Standard
\align center
\begin_inset Graphics
filename ValgrindMemoryAnalyzer.png
scale 40
\end_inset
\end_layout
\begin_layout Standard
This will run your program, keeping track of the memory that is allocated
and freed.
After the program has finished running, you will see a message indicating
any leaks that occurred.
In the example below, we never deleted the ConstantBrush, so 32 bytes of
memory were leaked.
The message points us to the exact line where this memory was allocated.
\end_layout
\begin_layout Standard
\align center
\begin_inset Graphics
filename MemoryLeak.png
scale 40
\end_inset
\end_layout
\begin_layout Standard
If no memory was leaked during the execution of your program, you will not
see any messages displayed in that section, as shown below.
\end_layout
\begin_layout Standard
\align center
\begin_inset Graphics
filename NoMemoryLeaks.png
scale 40
\end_inset
\end_layout
\begin_layout Standard
Note that if no messages are displayed, it does not necessarily mean that
your program is leak-free.
It only means that no leaks occurred during that run of the program.
For example, the code below only deletes the object if myBoolean is true.
If myBoolean happened to be true when running Valgrind Memory Analyzer,
no leak messages would show up, but your program can still leak memory
if myBoolean is false.
\end_layout
\begin_layout LyX-Code
MyObject *object = new MyObject();
\end_layout
\begin_layout LyX-Code
if (myBoolean) {
\end_layout
\begin_deeper
\begin_layout LyX-Code
delete object;
\end_layout
\end_deeper
\begin_layout LyX-Code
}
\end_layout
\begin_layout Standard
Valgrind can be a very useful tool for detecting memory leaks, but it will
not find them if you don't explicitly cause a certain branch of code to
be executed while using it.
As a result, you want to make sure you design your program such that memory
leaks can be prevented in the first place.
\end_layout
\begin_layout Section
Preventing Memory Leaks
\end_layout
\begin_layout Standard
The rule of thumb for creating objects in C++ is that every new should correspon
d to exactly one delete.
You shouldn't need to worry about this if you're using smart pointers!
Remember, don't allocate dynamic memory to a raw pointer.
\end_layout
\begin_layout Standard
Another source of common errors is arrays/vectors.
As usual, using vectors over arrays whenever possible will solve many of
your problems.
You might run into the issue where you access or write to indices past
the length of the vector.
If you see unexplained segfaults, check your indices!
\end_layout
\begin_layout Section
GPU Memory Leaks
\end_layout
\begin_layout Standard
Valgrind will only catch CPU memory leaks, but you can leak GPU memory as
well.
To avoid this, make sure that each call to a glGen*() function (usually
in a constructor) is matched with its corresponding glDelete*() function
(usually in the destructor).
If you’re using the GL datatype classes you implemented in the labs, you
probably won’t need to worry about this either.
\end_layout
\end_body
\end_document