Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我将如何分配这个?_C++_Memory - Fatal编程技术网

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)