Skip to content

Commit 6c9c376

Browse files
committed
Fix: deallocate space of sub-arrays to avoid memory leaks
1 parent e2941a6 commit 6c9c376

4 files changed

Lines changed: 82 additions & 53 deletions

File tree

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,11 @@ for (int array_counter = 0; array_counter <= max_sub_dyn_arrays; array_counter++
4444
}
4545
4646
// Don't forget to deallocate
47+
DynamicArrayNode* current_ptr = dynamic_array.head_ptr;
48+
int i = 0;
49+
while (current_ptr != NULL) {
50+
clear_array((DynamicArray*)current_ptr->data);
51+
current_ptr = current_ptr->next_ptr;
52+
}
4753
clear_array(&dynamic_array);
4854
```

includes/tests.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ void test_clear_array_multiple_integer_elements();
1616
void test_append_another_dynamic_array_as_element();
1717
void test_clear_array_another_dynamic_array_as_element();
1818

19-
void test_append_multiple_other_dynamic_array_as_elements();
20-
void test_clear_array_multiple_other_dynamic_array_as_elements();
19+
void test_append_multiple_other_dynamic_arrays_as_elements();
20+
void test_clear_array_multiple_other_dynamic_arrays_as_elements();
2121

22-
void test_append_multiple_other_dynamic_array_as_elements_with_multiple_subelements();
23-
void test_clear_array_multiple_other_dynamic_array_as_elements_with_multiple_subelements();
22+
void test_append_one_dimensional_dyn_arrays_to_two_dimensional_array();
23+
void test_clear_one_dimensional_dyn_arrays_in_two_dimensional_array();
2424

2525
/*
2626
Invalid arrays

tests/test.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,18 @@ int main(int argc, const char** argv) {
3737
test_clear_array_another_dynamic_array_as_element();
3838
printf("O.K.\n");
3939

40-
printf(" > Testing 'test_append_multiple_other_dynamic_array_as_elements()'...");
41-
test_append_multiple_other_dynamic_array_as_elements();
40+
printf(" > Testing 'test_append_multiple_other_dynamic_arrays_as_elements()'...");
41+
test_append_multiple_other_dynamic_arrays_as_elements();
4242
printf("O.K.\n");
43-
printf(" > Testing 'test_clear_array_multiple_other_dynamic_array_as_elements()'...");
44-
test_clear_array_multiple_other_dynamic_array_as_elements();
43+
printf(" > Testing 'test_clear_array_multiple_other_dynamic_arrays_as_elements()'...");
44+
test_clear_array_multiple_other_dynamic_arrays_as_elements();
4545
printf("O.K.\n");
4646

47-
printf(" > Testing 'test_append_multiple_other_dynamic_array_as_elements_with_multiple_subelements()'...");
48-
test_append_multiple_other_dynamic_array_as_elements_with_multiple_subelements();
47+
printf(" > Testing 'test_append_one_dimensional_dyn_arrays_to_two_dimensional_array()'...");
48+
test_append_one_dimensional_dyn_arrays_to_two_dimensional_array();
4949
printf("O.K.\n");
50-
printf(" > Testing 'test_clear_array_multiple_other_dynamic_array_as_elements_with_multiple_subelements()'...");
51-
test_clear_array_multiple_other_dynamic_array_as_elements_with_multiple_subelements();
50+
printf(" > Testing 'test_clear_one_dimensional_dyn_arrays_in_two_dimensional_array()'...");
51+
test_clear_one_dimensional_dyn_arrays_in_two_dimensional_array();
5252
printf("O.K.\n");
5353

5454
printf("\n> Testing invalid arrays\n");

tests/valid_arrays.c

Lines changed: 64 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ void test_append_another_dynamic_array_as_element() {
129129
assert(*(int*)((DynamicArray*)dynamic_array.tail_ptr->data)->head_ptr->data == sub_array_integer);
130130
assert(*(int*)((DynamicArray*)dynamic_array.tail_ptr->data)->tail_ptr->data == sub_array_integer);
131131

132-
clear_array(&dynamic_array);
133132
clear_array(&sub_dynamic_array);
133+
clear_array(&dynamic_array);
134134
}
135135

136136
void test_clear_array_another_dynamic_array_as_element() {
@@ -145,16 +145,15 @@ void test_clear_array_another_dynamic_array_as_element() {
145145
append_element(&dynamic_array, sizeof(DynamicArray), (void*)&sub_dynamic_array);
146146

147147
assert(clear_array(&dynamic_array) == NOERROR);
148-
// Should already be deallocated now
149148
assert(clear_array(&sub_dynamic_array) == NOERROR);
150149
}
151150

152151
/*
153152
Test valid arrays with multiple other dynamic-array as elements
154153
155-
- Each sub-dyn-array has only one element
154+
- Each sub-dynamic-array has only one element
156155
*/
157-
void test_append_multiple_other_dynamic_array_as_elements() {
156+
void test_append_multiple_other_dynamic_arrays_as_elements() {
158157
DynamicArray dynamic_array;
159158
init_array(&dynamic_array);
160159

@@ -173,10 +172,16 @@ void test_append_multiple_other_dynamic_array_as_elements() {
173172
current_ptr = current_ptr->next_ptr;
174173
}
175174

175+
current_ptr = dynamic_array.head_ptr;
176+
while (current_ptr != NULL) {
177+
clear_array((DynamicArray*)current_ptr->data);
178+
current_ptr = current_ptr->next_ptr;
179+
}
180+
176181
clear_array(&dynamic_array);
177182
}
178183

179-
void test_clear_array_multiple_other_dynamic_array_as_elements() {
184+
void test_clear_array_multiple_other_dynamic_arrays_as_elements() {
180185
DynamicArray dynamic_array;
181186
init_array(&dynamic_array);
182187

@@ -188,60 +193,78 @@ void test_clear_array_multiple_other_dynamic_array_as_elements() {
188193
assert(append_element(&dynamic_array, sizeof(DynamicArray), (void*)&sub_dynamic_array) == NOERROR);
189194
}
190195

196+
DynamicArrayNode* current_ptr = dynamic_array.head_ptr;
197+
while (current_ptr != NULL) {
198+
assert(clear_array((DynamicArray*)current_ptr->data) == NOERROR);
199+
current_ptr = current_ptr->next_ptr;
200+
}
201+
191202
assert(clear_array(&dynamic_array) == NOERROR);
192203
}
193204

194205

195206
/*
196-
Test valid arrays with multiple other dynamic-array as elements
207+
Test valid two-dimensional dynamic-arrays with one-dimensional dynamic-arrays as elements
197208
198-
- Each sub-dyn-array has multiple elements
209+
- Each sub-dynamic-array has multiple elements
199210
*/
200-
void test_append_multiple_other_dynamic_array_as_elements_with_multiple_subelements() {
201-
DynamicArray dynamic_array;
202-
init_array(&dynamic_array);
203-
204-
DynamicArray sub_dynamic_array;
205-
const int max_sub_dyn_arrays = 3;
206-
const int max_sub_dyn_arrays_elements = 3;
207-
for (int array_counter = 0; array_counter <= max_sub_dyn_arrays; array_counter++) {
208-
init_array(&sub_dynamic_array);
209-
for (int sub_element = 0; sub_element <= max_sub_dyn_arrays_elements; sub_element++) {
210-
assert(append_element(&sub_dynamic_array, sizeof(int), (void*)&sub_element) == NOERROR);
211+
void test_append_one_dimensional_dyn_arrays_to_two_dimensional_array() {
212+
DynamicArray one_dimensional_array;
213+
init_array(&one_dimensional_array);
214+
215+
DynamicArray two_dimensional_array;
216+
const int max_two_dim_arrays = 3;
217+
const int max_two_dim_arrays_elements = 3;
218+
for (int array_counter = 0; array_counter <= max_two_dim_arrays; array_counter++) {
219+
init_array(&two_dimensional_array);
220+
for (int sub_element = 0; sub_element <= max_two_dim_arrays_elements; sub_element++) {
221+
assert(append_element(&two_dimensional_array, sizeof(int), (void*)&sub_element) == NOERROR);
211222
}
212-
assert(append_element(&dynamic_array, sizeof(DynamicArray), (void*)&sub_dynamic_array) == NOERROR);
223+
assert(append_element(&one_dimensional_array, sizeof(DynamicArray), (void*)&two_dimensional_array) == NOERROR);
213224
}
214225

215-
DynamicArrayNode* current_ptr = dynamic_array.head_ptr;
216-
DynamicArrayNode* sub_array_current_ptr = NULL;
217-
int sub_element = 0;
226+
DynamicArrayNode* current_ptr = one_dimensional_array.head_ptr;
227+
DynamicArrayNode* two_dim_array_current_ptr = NULL;
228+
int element = 0;
218229
while (current_ptr != NULL) {
219-
sub_array_current_ptr = ((DynamicArray*)current_ptr->data)->head_ptr;
220-
sub_element = 0;
221-
while (sub_array_current_ptr != NULL) {
222-
assert(*(int*)sub_array_current_ptr->data == sub_element++);
223-
sub_array_current_ptr = sub_array_current_ptr->next_ptr;
230+
two_dim_array_current_ptr = ((DynamicArray*)current_ptr->data)->head_ptr;
231+
element = 0;
232+
while (two_dim_array_current_ptr != NULL) {
233+
assert(*(int*)two_dim_array_current_ptr->data == element++);
234+
two_dim_array_current_ptr = two_dim_array_current_ptr->next_ptr;
224235
}
225236
current_ptr = current_ptr->next_ptr;
226237
}
227238

228-
clear_array(&dynamic_array);
229-
}
239+
current_ptr = one_dimensional_array.head_ptr;
240+
while (current_ptr != NULL) {
241+
clear_array((DynamicArray*)current_ptr->data);
242+
current_ptr = current_ptr->next_ptr;
243+
}
230244

231-
void test_clear_array_multiple_other_dynamic_array_as_elements_with_multiple_subelements() {
232-
DynamicArray dynamic_array;
233-
init_array(&dynamic_array);
245+
clear_array(&one_dimensional_array);
246+
}
234247

235-
DynamicArray sub_dynamic_array;
236-
const int max_sub_dyn_arrays = 10;
237-
const int max_sub_dyn_arrays_elements = 10;
238-
for (int array_counter = 0; array_counter <= max_sub_dyn_arrays; array_counter++) {
239-
init_array(&sub_dynamic_array);
240-
for (int sub_element = 0; sub_element <= max_sub_dyn_arrays_elements; sub_element++) {
241-
assert(append_element(&sub_dynamic_array, sizeof(int), (void*)&sub_element) == NOERROR);
248+
void test_clear_one_dimensional_dyn_arrays_in_two_dimensional_array() {
249+
DynamicArray one_dimensional_array;
250+
init_array(&one_dimensional_array);
251+
252+
DynamicArray two_dimensional_array;
253+
const int max_two_dim_arrays = 10;
254+
const int max_two_dim_arrays_elements = 10;
255+
for (int array_counter = 0; array_counter <= max_two_dim_arrays; array_counter++) {
256+
init_array(&two_dimensional_array);
257+
for (int sub_element = 0; sub_element <= max_two_dim_arrays_elements; sub_element++) {
258+
assert(append_element(&two_dimensional_array, sizeof(int), (void*)&sub_element) == NOERROR);
242259
}
243-
assert(append_element(&dynamic_array, sizeof(DynamicArray), (void*)&sub_dynamic_array) == NOERROR);
260+
assert(append_element(&one_dimensional_array, sizeof(DynamicArray), (void*)&two_dimensional_array) == NOERROR);
244261
}
245262

246-
assert(clear_array(&dynamic_array) == NOERROR);
263+
DynamicArrayNode* current_ptr = one_dimensional_array.head_ptr;
264+
while (current_ptr != NULL) {
265+
clear_array((DynamicArray*)current_ptr->data);
266+
current_ptr = current_ptr->next_ptr;
267+
}
268+
269+
assert(clear_array(&one_dimensional_array) == NOERROR);
247270
}

0 commit comments

Comments
 (0)