Fix memory leak in balancing.
This commit is contained in:
+7
-6
@@ -21,18 +21,19 @@ int main() {
|
|||||||
vase.insert(100, "gr\ntt", 5);
|
vase.insert(100, "gr\ntt", 5);
|
||||||
vase.insert(20, "gr\ntt", 5);
|
vase.insert(20, "gr\ntt", 5);
|
||||||
|
|
||||||
vase.type(5, 'k');
|
vase.type(5, '1');
|
||||||
vase.type(6, 'l');
|
vase.type(6, '2');
|
||||||
vase.type(7, 'm');
|
vase.type(7, '3');
|
||||||
vase.type(8, 'n');
|
vase.type(8, '4');
|
||||||
|
|
||||||
|
vase.erase(9, -2);
|
||||||
|
|
||||||
print_shard(vase.root);
|
print_shard(vase.root);
|
||||||
|
|
||||||
LineIterator it(vase.root, 3);
|
LineIterator it(vase.root, 3);
|
||||||
std::string line;
|
std::string line;
|
||||||
while (it.next(line)) {
|
while (it.next(line))
|
||||||
std::cout << line << "\n";
|
std::cout << line << "\n";
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "\n\n"
|
std::cout << "\n\n"
|
||||||
<< vase.to_string();
|
<< vase.to_string();
|
||||||
|
|||||||
@@ -43,10 +43,12 @@ Shard *balance(Shard *node) {
|
|||||||
if (bf > 1) {
|
if (bf > 1) {
|
||||||
Branch *left = (Branch *)b->left;
|
Branch *left = (Branch *)b->left;
|
||||||
if (balance_factor(left) < 0) {
|
if (balance_factor(left) < 0) {
|
||||||
|
Shard::retain(left);
|
||||||
auto new_left = rotate_left(left);
|
auto new_left = rotate_left(left);
|
||||||
auto rebuilt = new Branch(new_left, b->right);
|
auto rebuilt = new Branch(new_left, b->right);
|
||||||
auto result = rotate_right((Branch *)rebuilt);
|
auto result = rotate_right((Branch *)rebuilt);
|
||||||
Shard::release(new_left);
|
Shard::release(new_left);
|
||||||
|
Shard::release(b);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
return rotate_right(b);
|
return rotate_right(b);
|
||||||
@@ -55,10 +57,12 @@ Shard *balance(Shard *node) {
|
|||||||
if (bf < -1) {
|
if (bf < -1) {
|
||||||
Branch *right = (Branch *)b->right;
|
Branch *right = (Branch *)b->right;
|
||||||
if (balance_factor(right) > 0) {
|
if (balance_factor(right) > 0) {
|
||||||
|
Shard::retain(right);
|
||||||
auto new_right = rotate_right(right);
|
auto new_right = rotate_right(right);
|
||||||
auto rebuilt = new Branch(b->left, new_right);
|
auto rebuilt = new Branch(b->left, new_right);
|
||||||
auto result = rotate_left((Branch *)rebuilt);
|
auto result = rotate_left((Branch *)rebuilt);
|
||||||
Shard::release(new_right);
|
Shard::release(new_right);
|
||||||
|
Shard::release(b);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
return rotate_left(b);
|
return rotate_left(b);
|
||||||
|
|||||||
Reference in New Issue
Block a user