Как бы я перераспределил это? - PullRequest
0 голосов
/ 13 марта 2019

Просто любопытно, как бы я удалил это, как только оно будет использовано.

TicTacNode *t[nodenum];
for (int i = 0; i < nodenum; ++i)
{
  t[i] = new TicTacNode();
}

Нужно ли удалять указатели, которым присвоены значения в t?Например,

TicTacNode * m = (t[i + 1]);

Ответы [ 4 ]

2 голосов
/ 13 марта 2019

Вот так:

TicTacNode *t[nodenum] = {};

for (int i = 0; i < nodenum; ++i)
{
  t[i] = new TicTacNode();
}

...

for (int i = 0; i < nodenum; ++i)
{
  delete t[i];
}

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

#include <memory>

std::unique_ptr<TicTacNode> t[nodenum];

for (int i = 0; i < nodenum; ++i)
{
  t[i].reset(new TicTacNode);

  // or, in C++14 and later:
  // t[i] = std::make_unique<TicTacNode>();
}

Или вы вообще не можете использовать динамическое распределение:

TicTacNode t[nodenum];
0 голосов
/ 14 марта 2019

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

В вашем случае std :: vector или std :: list могут выполнять работу очень хорошо

Использование std :: vector в целомкод может быть заменен на

auto t = std::vector<TicTacNode>(nodenum)

или с использованием std :: list

auto t = std::list<TicTacNode>(nodenum)

Преимущества :

  • Меньшеи чистый код.

    Нет необходимости в std :: new, поскольку оба контейнера будут выделять и инициализировать узлы объектов.

    Нет необходимости в std :: delete, поскольку контейнеры автоматически освобождают память приони выходят за рамки.

0 голосов
/ 13 марта 2019

Просто любопытно, как бы я удалил это, как только оно будет сделано.

Так просто, как это:

std::unique_ptr<TicTacNode> t[nodenum];
for (int i = 0; i < nodenum; ++i)
{
  t[i] = std::make_unique<TicTacNode>();
}
// as soon as scope for t ends all data will be cleaned properly 

или даже проще, как выглядитвроде нет причин их динамически распределять:

TicTacNode t[nodenum]; // default ctor is called for each object and all will be deleted when t destroyed
0 голосов
/ 13 марта 2019

Нужно ли удалять какие-либо указатели, которым присвоены значения в t?

Нет.Однако вы должны убедиться, что вы больше не используете эти указатели после освобождения памяти.

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