Эта строка вашего кода ItemList[i] = new ItemInfo(info.at(i).ItemName);
не выделяет динамический массив, но этот код в вашем деструкторе пытается удалить его, как если бы он был динамическим массивом.
for(int i = 0; i<ItemCount;i++){
delete[] ItemList[i];
}
Быстрым решением было бы изменить delete [] на delete .Однако кажется, что было бы намного проще просто выделить один динамический массив.Другими словами, выделите ItemList как таковой ItemList = new ItemInfo[ItemCount];
Конечно, вам придется изменить тип, но это имеет больше смысла из того, что вы опубликовали.
Другая возможная проблема заключается в том, что в вашем деструкторе вы не проверяетеесли ItemList является nullptr или фактически выделен для чего-либо.На что ваш деструктор может попытаться получить доступ к неверным данным.Кроме того, ваш оператор перемещения удаляет ItemList, не удаляя данные внутри него.
Вы можете создать функцию для освобождения данных в ItemList и затем вызвать эту функцию из деструктора и оператора перемещения.
Кстати, почему вы используете динамические двумерные массивы, когда кажется, что вы знаете, как использовать векторы?Вектор справился бы со всем этим гораздо проще.Например, тип будет std::vector<std::vector<ItemInfo>>
.