LINUX.ORG.RU

История изменений

Исправление 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 «сами по себе» не уничтожаются).