两次的C ++对象数组

问题描述

| 我有一个类“ 0”,其中包含类“ 1”的指针(数组)。 现在,我要做的是先创建一个
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
不幸的是,我一直在运行分段错误错误。我试着用更新后的声明用5分配数组,使它成为指针数组。不过,我没有任何结果。     

解决方法

假设您要创建
Agent
数组而不初始化这些代理是不合时宜的。初始化在构造期间进行。如果不进行某种初始化,就无法创建事物。 在几乎每种情况下,在C ++中要做的“正确”的事情是对数组使用
vector
或其他标准容器,然后在创建它们时elements8ѭ个新元素。您应该查看这是否是适合您的方法。可能一无所知。 也许您的意思(或您想要的)是为数组创建内存空间,然后在加载它们时对其进行初始化。这是非常罕见的,但是确实发生了。在这种情况下,首先您可以分配一个足以容纳所有物品的ѭ9缓冲区:
char buf[correct_size];
...然后使用placement-new在此缓冲区中初始化您的ѭ0:
new (&buf[byte_index]) Agent(parameter_list);
这很棘手。使用新的刊登位置时,您必须权衡以下几点: 您需要确保在缓冲区中使用正确的
byte_index
。 您需要确保以正确的顺序进行释放:首先销毁0,然后销毁它们所在的缓冲区。 您必须显式调用析构函数才能销毁ѭ0: #3的示例:
Agent* agent = reinterpret_cast<Agent*>(&buf[byte_index]);
agent->~Agent();
这是大约一百万种不同方式的危险代码。我不能太强调压力,不管尝试这样做的时间和空间多么诱人,您可能都不应该在生产代码中这样做。当绝对没有其他效果时,使用new放置应该是最后的选择。