Как выделить память с «новым» вместо malloc? - PullRequest
1 голос
/ 05 октября 2019

В качестве домашнего задания я должен написать программу, которая работает вокруг структур. В качестве первой задачи мне нужно написать функцию, которая выделяет память для массива из N указателей, которые указывают на новые структуры (пользователь принимает решение о значении N) и возвращает адрес массива. Первая проблема, которую я имею, это понимание формы malloc. Я спросил своего профессора, что было бы эквивалентно при использовании «new», потому что это более прозрачно для меня, но он ответил, что я должен придерживаться malloc, чтобы избежать ошибок. Следующая функция выглядит следующим образом:

struct Structure
{
    int a;
    char b;
    float c;
};

Structure** allocating(int N)
{
    struct Structure** tab = (struct Structure**) malloc(amount * sizeof(struct Structure*));
    for (int i = 0; i < N; i++)
    {
        tab[i] = (struct Structure*) malloc(sizeof(struct Structure));
    }
    return tab;
}

Я пытался понять эту форму выделения памяти, но до сих пор я понимаю, как будто я выделяю память для указателя, указывающего на массив указателей (double **) это не то, что было указано в задаче. Подводя итог, я не понимаю, как пишется распределение и как его можно написать с помощью new.

1 Ответ

0 голосов
/ 05 октября 2019

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

Прямой эквивалент с использованием new будет выглядеть так:

Structure** allocating(int N)
{
    struct Structure** tab = new Structure*[N];
    for (int i = 0; i < N; i++)
    {
        tab[i] = new Structure;
    }
    return tab;
}

Распределение может быть немного сложнее:

void deallocating(Structure** tab, int N)
{
    for (int i = 0; i < N; i++)
    {
        delete tab[i]; //delete objects
    }
    delete[] tab; //delete array itself, notice the [] after delete!
}

Если вы можете перейти к массиву объектов вместо массива указателей, код становится намного проще:

Structure* allocating(int N)
{
    return new Structure[N];
}

Позже вы также освободите его с помощью delete[]


Как отмечалось в комментариях, в C ++ мы предпочитаем не использовать управление памятью напрямую (особенно в современном ключевом слове C ++ *). 1023 * считается неприятным запахом ). std::vector может отлично справиться со всеми вашими требованиями к массиву, он никогда не утечет память и может легко изменить свой размер.

...