Я пишу гибридную программу, которая отправляет структуру, содержащую векторы спрайтов, с сервера клиенту после внесения изменений (добавлены новые маркеры, добавлен новый враг, удален враг или пуля). Программа часто добавляет несколько врагов в вектор в структуре.
Кажется, что отправка и получение структуры работает правильно, но когда я пытаюсь скопировать структуру в загруженную в клиентскую программу, программа вылетает. Я не уверен, должен ли я изменить размер структуры или как это сделать, или если есть другое решение для этого.
Вот моя структура:
struct map{
Player Player1;//DECLARE Player SPRITE
vector<Bullet> Bullets;
vector<Enemy*> Enemies;
}Map;
char Buffer[100];
и эта функция, которую я использую, используется после получения структуры:
memcpy(&Map, Buffer, sizeof(Buffer));
MessageBox (NULL, "Memcopied", "HelloMsg", MB_OK);
Буду очень признателен за любую помощь, спасибо
Похоже Player
и / или vector
находятся не только в стеке, но и имеют указатели на другое место, например, в кучу, чтобы хранить всю вашу информацию. Таким образом, эти указатели будут болтаться, как только вы распакуете свое сообщение. Вы должны попытаться создать свой собственный формат данных, где вся информация аккуратно размещается в памяти.
Старые функции C, такие как memcpy и memset, хороши для структур POD, но они очень опасны для структур / классов, которые содержат такие «сложные» объекты, как контейнеры std. Memcpy копирует объекты просто побайтно. Однако контейнеры std содержат указатели на память в куче, и когда вы копируете их с помощью memcpy, вы получаете два объекта, указывающих на одну и ту же память. Когда один из них уничтожен, другой все еще указывает на удаленную память. Это вызывает аварию. Я думаю, что вам нужно какой-то конкретный тип для передачи данных с сервера на клиент.