История изменений
Исправление neversleep, (текущая версия) :
Про Box уже посоветовали, чтобы развеять все сомнения, вот пример на C
:
#include <stdio.h>
#include <stdlib.h>
struct A {
int i;
};
struct B {
struct A *a;
};
struct A* create_struct_a(int i) {
struct A *a = (struct A*) malloc(sizeof(struct A));
a->i = i;
return a;
}
void free_struct_a(struct A *a) {
free((void *)a);
}
struct B* create_struct_b(int i) {
struct B *b = (struct B*) malloc(sizeof(struct B));
b->a = create_struct_a(i);
return b;
}
void free_struct_b(struct B *b) {
free_struct_a(b->a);
free(b);
}
int main()
{
struct B *b = create_struct_b(123);
printf("%d\n", b->a->i);
free_struct_b(b);
return 0;
}
Как я понимаю, в Rust деструкторы будут не нужны (надо получше ознакомиться с Box, и про то, в какой момент они уничтожаются, но вот судя по названию именно метода Box::leak
, такие Boxes «сами по себе» не уничтожаются).
Исходная версия neversleep, :
Про Box уже посоветовали, чтобы развеять все сомнения, вот пример на C
:
#include <stdio.h>
#include <stdlib.h>
struct A {
int i;
};
struct B {
struct A *a;
};
struct A* create_struct_a(int i) {
struct A *a = (struct A*) malloc(sizeof(struct A));
a->i = i;
return a;
}
void free_struct_a(struct A *a) {
free((void *)a);
}
struct B* create_struct_b(int i) {
struct B *b = (struct B*) malloc(sizeof(struct B));
b->a = create_struct_a(i);
return b;
}
void free_struct_b(struct B *b) {
free_struct_a(b->a);
free(b);
}
int main()
{
struct B *b = create_struct_b(123);
printf("%d\n", b->a->i);
free_struct_b(b);
return 0;
}
Как я понимаю, в Rust деструкторы будут не нужны (надо получше ознакомится с Box, и про то, в какой момент они уничтожаются, но вот судя по названию именно метода Box::leak
, такие Boxes «сами по себе» не уничтожаются).