Можно ли освободить память, выделенную для многомерного массива - PullRequest
0 голосов
/ 29 ноября 2018

У меня в основном есть uint64_t[8][3] Мне, однако, не нужны все позиции в этом массиве. Я мог бы создать другую структуру узлов, чтобы динамически устанавливать только правильные позиции, но это было бы сложнее, потому что я полагаюсь на индексы матрицы для моей конкретной программы.,Как я могу выборочно освободить некоторые индексы матрицы.

Например, мне не нужны uint64_t [4] [3] или uint64_t [7] [3] для конкретного узла. Как мне это освободить?

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Вы можете освободить элементы в определенных индексах, если они динамически распределяются с помощью delete (например, delete variableName [0] [2]), но вы не можете удалить сами индексы.

0 голосов
/ 29 ноября 2018

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

, если вам все еще нужномассивы не используют старые массивы в стиле c, комитет по c ++ активно обновляет стандарт с 1998 года, а современный способ работы с массивами - использование std :: array .Если вы работаете в среде, где вы работаете со старыми C-API, напишите свою логику в современной c ++ статической библиотеке , скомпилируйте ее и создайте ссылку на эту библиотеку в вашем C-API.

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

, если вам действительно нужно, чтобы некоторые значения в массиве были нулевыми, чтобы вы моглиделать с ним сумасшедшие вещи (такие как проверка на ноль, что я бы очень не рекомендовал), вы должны заключить вас в другое целое число:

class Integer
{
public:
    explicit Integer(int value)
    {
        value_ = value;
    };
    Integer &operator=(Integer other)
    {
        value_ = other.value_;
    };

private:
    int value_;
};

class test
{
public:
    test()
    {
        Integer four(4);

        std::array<std::unique_ptr<Integer>, 2> arr = { std::make_unique<Integer>(four), nullptr};
    };
};

ПРИМЕЧАНИЕ I: То, что я написал выше, - всего лишь уловка, так что вы знаете,в C ++ все возможно, однако сложность того, что я только что написал для достижения того, что вы хотели, должна убедить вас, что это не очень хороший подход для вашего простого случая.

ПРИМЕЧАНИЕ II: Код не проверен, неиспользуйте это как есть в производственном коде.

0 голосов
/ 29 ноября 2018

Вы не можете освободить его, это CPP, вот как это работает ...

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