很好奇我一旦完成使用该如何删除它。
TicTacNode *t[nodenum];
for (int i = 0; i < nodenum; ++i)
{
t[i] = new TicTacNode();
}
是否还需要删除所有在t中分配了值的指针?例如,
TicTacNode * m = (t[i + 1]);
答案 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,因为容器将释放内存 当它们超出范围时会自动显示。