C ++ Массив объектов в два раза - PullRequest
0 голосов
/ 24 мая 2011

У меня есть класс Agent, который содержит указатель (массив) класса ValueContainer.

Теперь я должен создать массив Agent first и , затем инициализируют каждый из них независимо.Кроме того, 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, с объявлением преувеличения, сделав его массивом указателей.Тем не менее, у меня нет никаких результатов.

1 Ответ

1 голос
/ 24 мая 2011

Сказать, что вы хотите создать массив Agent без инициализации этих агентов, - анахронизм. Инициализация происходит во время строительства. Вы не можете создать что-либо, не выполнив какую-либо инициализацию.

Почти в каждом случае "правильная" вещь, которую нужно сделать в C ++, это использовать vector или какой-либо другой стандартный контейнер для вашего массива, а затем push_back новые элементы при их создании. Вы должны убедиться, что это правильный подход для вас. Ничего не зная о вашем приложении, вероятно, так оно и есть.

Возможно, вы имеете в виду (или, может быть, то, что хотите), чтобы создать пространство памяти для массива, а затем инициализировать их при загрузке. Это довольно редко, но это случается. В этом случае сначала вы можете выделить достаточно большой буфер char, чтобы вместить все ваши элементы:

char buf[correct_size];

... и затем используйте place-new для инициализации Agent s в этом буфере:

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

Это сложно. При использовании нового размещения вы должны манипулировать несколькими вещами:

  1. Вы должны убедиться, что используете правильный byte_index в буфере.
  2. Вам нужно убедиться, что вы освободили в правильном порядке: сначала уничтожьте Agent, затем уничтожьте буфер, в котором они находятся.
  3. Вы должны явно вызвать деструктор, чтобы уничтожить Agent s:

Пример # 3:

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

Это рискованный код примерно миллионами разных способов. Я не могу особо подчеркнуть, что, как бы ни старались сделать это космическая эра и искушение, вам, вероятно, не следует делать это в рабочем коде. Использование размещения new должно быть последним средством, когда абсолютно ничего не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...