Fix memory leak
This commit is contained in:
@@ -731,14 +731,15 @@ Node *&getOrCreateChild(Node *&self, uint8_t index) {
|
|||||||
}
|
}
|
||||||
if (self->numChildren == 4) {
|
if (self->numChildren == 4) {
|
||||||
auto *newSelf = new (safe_malloc(sizeof(Node16))) Node16;
|
auto *newSelf = new (safe_malloc(sizeof(Node16))) Node16;
|
||||||
memcpy((void *)newSelf, self, offsetof(Node, type));
|
memcpy(newSelf, self, offsetof(Node, type));
|
||||||
|
memcpy(newSelf->index, self4->index, 4);
|
||||||
|
memcpy(newSelf->children, self4->children, 4 * sizeof(void *));
|
||||||
|
free(self);
|
||||||
|
self = newSelf;
|
||||||
|
setChildrenParents(self);
|
||||||
if (newSelf->parent) {
|
if (newSelf->parent) {
|
||||||
getOrCreateChild(newSelf->parent, newSelf->parentsIndex) = newSelf;
|
getOrCreateChild(newSelf->parent, newSelf->parentsIndex) = newSelf;
|
||||||
}
|
}
|
||||||
memcpy(newSelf->index, self4->index, 4);
|
|
||||||
memcpy(newSelf->children, self4->children, 4 * sizeof(void *));
|
|
||||||
self = newSelf;
|
|
||||||
setChildrenParents(self);
|
|
||||||
goto insert16;
|
goto insert16;
|
||||||
} else {
|
} else {
|
||||||
++self->numChildren;
|
++self->numChildren;
|
||||||
@@ -770,9 +771,6 @@ Node *&getOrCreateChild(Node *&self, uint8_t index) {
|
|||||||
auto *newSelf = new (safe_malloc(sizeof(Node48))) Node48;
|
auto *newSelf = new (safe_malloc(sizeof(Node48))) Node48;
|
||||||
memcpy((void *)newSelf, self, offsetof(Node, type));
|
memcpy((void *)newSelf, self, offsetof(Node, type));
|
||||||
newSelf->nextFree = 16;
|
newSelf->nextFree = 16;
|
||||||
if (newSelf->parent) {
|
|
||||||
getOrCreateChild(newSelf->parent, newSelf->parentsIndex) = newSelf;
|
|
||||||
}
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (auto x : self16->index) {
|
for (auto x : self16->index) {
|
||||||
newSelf->children[i] = self16->children[i];
|
newSelf->children[i] = self16->children[i];
|
||||||
@@ -780,8 +778,12 @@ Node *&getOrCreateChild(Node *&self, uint8_t index) {
|
|||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
assert(i == 16);
|
assert(i == 16);
|
||||||
|
free(self);
|
||||||
self = newSelf;
|
self = newSelf;
|
||||||
setChildrenParents(self);
|
setChildrenParents(self);
|
||||||
|
if (newSelf->parent) {
|
||||||
|
getOrCreateChild(newSelf->parent, newSelf->parentsIndex) = newSelf;
|
||||||
|
}
|
||||||
goto insert48;
|
goto insert48;
|
||||||
} else {
|
} else {
|
||||||
++self->numChildren;
|
++self->numChildren;
|
||||||
@@ -810,16 +812,17 @@ Node *&getOrCreateChild(Node *&self, uint8_t index) {
|
|||||||
if (self->numChildren == 48) {
|
if (self->numChildren == 48) {
|
||||||
auto *newSelf = new (safe_malloc(sizeof(Node256))) Node256;
|
auto *newSelf = new (safe_malloc(sizeof(Node256))) Node256;
|
||||||
memcpy((void *)newSelf, self, offsetof(Node, type));
|
memcpy((void *)newSelf, self, offsetof(Node, type));
|
||||||
if (newSelf->parent) {
|
|
||||||
getOrCreateChild(newSelf->parent, newSelf->parentsIndex) = newSelf;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < 256; ++i) {
|
for (int i = 0; i < 256; ++i) {
|
||||||
if (self48->index[i] >= 0) {
|
if (self48->index[i] >= 0) {
|
||||||
newSelf->children[i] = self48->children[self48->index[i]];
|
newSelf->children[i] = self48->children[self48->index[i]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
free(self);
|
||||||
self = newSelf;
|
self = newSelf;
|
||||||
setChildrenParents(self);
|
setChildrenParents(self);
|
||||||
|
if (newSelf->parent) {
|
||||||
|
getOrCreateChild(newSelf->parent, newSelf->parentsIndex) = newSelf;
|
||||||
|
}
|
||||||
goto insert256;
|
goto insert256;
|
||||||
} else {
|
} else {
|
||||||
++self->numChildren;
|
++self->numChildren;
|
||||||
|
Reference in New Issue
Block a user