Освободите память, на которую указывает uintptr_t - PullRequest
0 голосов
/ 05 мая 2020

У меня следующая проблема:

Прежде всего, у меня есть структура:

struct Filehandler
{
    const int id = 1;
};

Затем у меня есть два метода - один для создания новой структуры Filehandler, а другой для удаления структуры . Поскольку весь код является частью подключаемого модуля Webassembly для проекта Rust, я должен использовать указатели.

Итак, это мой метод выделения структуры:

uintptr_t newhandler() {

    struct Filehandler* filehandler = (struct Filehandler*) malloc(sizeof(struct Filehandler));
    uintptr_t *ptr = (uintptr_t *)&filehandler;
    uintptr_t temp = (uintptr_t)ptr;
    return temp;
}

Я как-то это знаю выглядит запутанным, но мне нужно получить адрес, на который указывает указатель как значение. Вот почему я возвращаю свой указатель как значение.

Теперь я хочу создать функцию, которая удаляет структуру. В качестве параметра функция получает uintptr_t:

void destroy_handler(uintptr_t ptr) {
    ........?
}

Итак, мой вопрос: можно ли удалить Struct filehandler, если у меня есть указатель на него, хранящийся в uintptr_t и передайте его как значение функции destroy_handler. И если это возможно, как мне это сделать?

Спасибо, ребята!

1 Ответ

5 голосов
/ 05 мая 2020
  • const int id = 1; недействителен C, потому что вы не можете инициализировать члены такой структуры. В общем, избегайте квалификаторов const членов, но вместо этого создайте экземпляр всей структуры const.
  • uintptr_t newhandler() должно быть uintptr_t newhandler(void), первый стиль является устаревшим и не должен использоваться.
  • Кастовать результат mallo c бессмысленно. Вместо этого рассмотрите struct Filehandler* filehandler = malloc (sizeof *filehandler);.
  • uintptr_t *ptr = (uintptr_t *)&filehandler; не имеет никакого смысла, вы приводите mallo c: ed адрес указателя , который является локальной переменной. Отбросьте &.
  • uintptr_t temp = (uintptr_t)ptr; не имеет никакого смысла, потому что вы снова вводите адрес локального указателя.

Фиксированный код должен выглядеть примерно так например:

struct Filehandler
{
    int id;
};

const struct Filehandler FH = {.id = 1};

...

#include <stdlib.h>

uintptr_t newhandler (void) 
{
  struct Filehandler* filehandler = malloc(sizeof *filehandler);
  if(filehandler == NULL)
  {
    return 0;
  }

  // optional line: memcpy(filehandler, &FH, sizeof FH);

  return (uintptr_t)filehandler;
}


void destroy_handler(uintptr_t ptr) 
{
  free((void*)ptr);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...