gpt4 book ai didi

C++ 对象数组两次

转载 作者:行者123 更新时间:2023-11-28 08:20:06 27 4
gpt4 key购买 nike

我有一个 Agent 类,它包含一个 ValueContainer 类的指针(数组)。

现在我要做的是创建一个 Agent 数组首先,然后然后独立地初始化它们中的每一个。此外,Agent 由于其性质,没有空构造函数。

大致是这样的:

Agent agent[n];
for (int i...)
{
load values from hd;
create a ValueContainer with this values;
initialize Agent[i] with loaded values;
deallocate the upstated ValueContainer;
}
// agent's constructor copies the VC values in his own VC,
// so there is no problem of pointers

不幸的是,我一直在运行段错误。我尝试使用 malloc 分配数组,使用更新的声明,使其成为指针数组。不过,我还没有任何结果。

最佳答案

说您想创建一个 Agent 数组而不初始化这些代理是不合时宜的。初始化发生在构建过程中。如果不进行某种初始化,就无法创建事物。

在几乎所有情况下,在 C++ 中“正确”的做法是为数组使用 vector 或其他一些标准容器,然后 push_back 新元素当您创建它们时。您应该看看这是否适合您。在对您的应用程序一无所知的情况下,它可能是。

也许你的意思(或者也许你想要的)是为数组创建内存空间,然后在加载它们时初始化它们。这种情况很少见,但确实会发生。在这种情况下,首先您可以分配一个足够大的 char 缓冲区来容纳您的所有项目:

char buf[correct_size];

...然后使用 placement-new在此缓冲区中初始化您的 Agent:

new (&buf[byte_index]) Agent(parameter_list);

这很棘手。使用 placement new 时,您必须兼顾几件事:

  1. 您需要确保在缓冲区中使用正确的 byte_index
  2. 您需要确保以正确的顺序解除分配:首先销毁 Agent,然后销毁它们所在的缓冲区。
  3. 您必须显式调用析构函数才能销毁 Agent:

#3 的示例:

Agent* agent = reinterpret_cast<Agent*>(&buf[byte_index]);
agent->~Agent();

从大约一百万种不同的角度来看,这是有风险的代码。我怎么强调都不过分,无论尝试这样做多么太空时代和诱人,您可能都不应该在生产代码中这样做。使用 placement new 应该是万不得已的最后手段。

关于C++ 对象数组两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6104929/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com