Как выделить память для массива очередей по malloc? - PullRequest
0 голосов
/ 15 сентября 2018

Я попытался выделить динамическую память для массива пустых очередей, используя функцию malloc, как показывает код. Однако вывод (*pq).size() неверен -128, и вызов (*pq).push() вызовет ошибку. Где я неправ? Как правильно распределить память?

#include <stdio.h>
#include <stdlib.h>
#include <queue>

typedef std::queue<int> iq;

iq *pq;

int main() {
    pq = (iq *) malloc(16 * sizeof(iq));
    printf("%d\n", (*pq).size());
    printf("%d\n", (*pq).empty());
//    (*pq).push(12);
    (*pq).pop();
    printf("%d\n", (*pq).size());
    free(pq);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Как выделить память для массива очередей по malloc?

Так же, как вы сделали в своем примере. Технически, это не распределение, это неправильно. Хотя, см. .

Где я ошибся?

Вы только выделили некоторое количество памяти для очередей. Вы никогда не создавали какой-либо объект очереди в этот блок памяти. Динамические объекты создаются с использованием выражения new. Чтобы создать объект в блоке памяти, выделенном malloc, вы можете использовать синтаксис размещения с новым.

Как правильно распределить память?

Не используя malloc.

Нет веских причин для использования malloc в C ++.

Вот правильный способ выделить динамическую память для массива из 16 очередей, а также построить эти очереди:

std::vector<std::queue<int> > pq(16);

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

0 голосов
/ 15 сентября 2018

Не ясно, является ли malloc требованием вашего решения. Нативное решение C ++ позволяет избежать большинства проблем с удобочитаемой семантикой. Смотри ниже.

В приведенном ниже коде я переключился на использование iostream и vector, поскольку это освобождает вас от необходимости рассуждать обо всем на том же уровне абстракции. Malloc - это низкоуровневая процедура C для выделения динамической памяти. Вы уже используете std::queue, поэтому не имеет смысла смешивать malloc, когда vector будет хорошо работать.

Решение

#include <queue>
#include <iostream>
#include <vector>

using iq = std::queue<int>;
using vec = std::vector<iq>;

int main()
{
    using namespace std;
    vec pq;
    pq.resize(16);
    pq[0].empty();
    cout << pq[0].size() << endl;
    pq[0].push(12);
    pq[0].push(13);
    pq[0].push(11);
    pq[0].pop();
    cout << pq[0].size() << endl;
    return 0;
}

Пример вывода

$main
0
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...