C++ 我将如何分配这个?
只是好奇,一旦它被使用,我会如何删除它C++ 我将如何分配这个?,c++,memory,C++,Memory,只是好奇,一旦它被使用,我会如何删除它 TicTacNode *t[nodenum]; for (int i = 0; i < nodenum; ++i) { t[i] = new TicTacNode(); } 像这样: TicTacNode *t[nodenum] = {}; for (int i = 0; i < nodenum; ++i) { t[i] = new TicTacNode(); } ... for (int i = 0; i < noden
TicTacNode *t[nodenum];
for (int i = 0; i < nodenum; ++i)
{
t[i] = new TicTacNode();
}
像这样:
TicTacNode *t[nodenum] = {};
for (int i = 0; i < nodenum; ++i)
{
t[i] = new TicTacNode();
}
...
for (int i = 0; i < nodenum; ++i)
{
delete t[i];
}
或者,您根本不能使用动态分配:
TicTacNode t[nodenum];
是否需要删除在t
中分配了值的任何指针
不可以。但是,您必须确保在释放内存后不再使用这些指针
只是好奇,一旦它被使用,我会如何删除它
就这么简单:
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
实际上,您不必显式地分配和释放内存。您所需要的只是工作的正确数据结构 在您的情况下,std::vector或std::list都可以很好地完成这项工作 使用std::vector,整个代码可以替换为
auto t = std::vector<TicTacNode>(nodenum)
auto t=std::vector(nodenum)
或者使用std::list
auto t = std::list<TicTacNode>(nodenum)
auto t=std::list(nodenum)
好处:
- 代码少而清晰 不需要std::new,因为两个容器都将分配和 初始化对象的nodenum 不需要std::delete,因为容器将释放内存 当它们超出范围时自动执行
必须有一个匹配的删除。所以你需要一个循环来删除t[i]代码>。按相反的顺序执行。但我根本不会那样做。在过去的8年中,我认为我不需要C++中的<代码>新<代码>或<代码>删除<代码>。
TicTacNode t[nodenum]; // default ctor is called for each object and all will be deleted when t destroyed
auto t = std::vector<TicTacNode>(nodenum)
auto t = std::list<TicTacNode>(nodenum)