我将如何取消分配?

时间:2019-03-13 20:44:11

标签: c++ memory

很好奇我一旦完成使用该如何删除它。

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

是否还需要删除所有在t中分配了值的指针?例如,

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

4 个答案:

答案 0 :(得分:2)

赞:

Foreach

尽管,您确实应该使用智能指针,而不用担心完全手动调用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>();
}

答案 1 :(得分:0)

  

是否也需要删除在t中分配了值的所有指针?

不。但是,必须确保在释放内存后不再使用这些指针。

答案 2 :(得分:0)

  

很好奇我一旦使用完该怎么删除它。

就这么简单:

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

答案 3 :(得分:0)

实际上,您不必显式分配和取消分配内存。您需要的只是适合工作的正确数据结构。

在您的情况下,std :: vector或std :: list可能会做得很好

使用std :: vector可能会将整个代码替换为

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

或使用std :: list

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

好处

  • 减少并清除代码。

    不需要std :: new,因为这两个容器都将分配和 初始化对象的节点数。

    不需要std :: delete,因为容器将释放内存 当它们超出范围时会自动显示。