C ++两次对象数组

时间:2011-05-24 01:43:23

标签: c++ arrays object

我有一个类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分配数组,使用upstated声明,使其成为一个指针数组。不过,我没有任何结果。

1 个答案:

答案 0 :(得分:1)

假设您想要创建一个Agent数组而不初始化这些代理是不合时宜的。初始化在施工期间进行。如果不进行某种初始化,就无法创建东西。

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

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

char buf[correct_size];

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

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

这很棘手。使用新的展示位置时,你必须处理好几件事:

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

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

    这是大约一百万种不同方式的风险代码。我无法强调的是,无论太空时代如何尝试这样做都很诱人,你可能不应该在生产代码中这样做。使用placement new应该是最后的手段,绝对没有别的办法。