我有一个类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声明,使其成为一个指针数组。不过,我没有任何结果。
答案 0 :(得分:1)
假设您想要创建一个Agent
数组而不初始化这些代理是不合时宜的。初始化在施工期间进行。如果不进行某种初始化,就无法创建东西。
几乎在所有情况下,在C ++中做的“正确”事情是为您的数组使用vector
或其他标准容器,然后在创建它们时使用push_back
个新元素。您应该看看这是否适合您。在不了解您的应用程序的情况下,它可能就是。
也许你的意思(或者你想要的)是为数组创建内存空间,然后在加载它们时初始化它们。这种情况非常罕见,但确实发生了。在这种情况下,首先您可以分配一个足够大的char
缓冲区来容纳您的所有项目:
char buf[correct_size];
...然后使用placement-new初始化此缓冲区中的Agent
:
new (&buf[byte_index]) Agent(parameter_list);
这很棘手。使用新的展示位置时,你必须处理好几件事:
byte_index
。Agent
,然后销毁它们所在的缓冲区。Agent
s:#3的例子:
Agent* agent = reinterpret_cast<Agent*>(&buf[byte_index]);
agent->~Agent();
这是大约一百万种不同方式的风险代码。我无法强调的是,无论太空时代如何尝试这样做都很诱人,你可能不应该在生产代码中这样做。使用placement new应该是最后的手段,绝对没有别的办法。