Я попытался выделить динамическую память для массива пустых очередей с помощью функции 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
valeera 15 Сен 2018 в 05:44

2 ответа

Лучший ответ

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

Где я неправ?

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

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

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

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

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

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

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

4
eerorika 15 Сен 2018 в 03:11

Неясно, является ли 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
0
Will Bickford 15 Сен 2018 в 02:58