Ваша ошибка вызвана этой строкой:
delete[] table;
, которая сообщает компилятору, что вы sh хотите удалить массив. table
не является массивом, хотя он может действовать аналогично этому, это указатель на одиночный объект в куче и вызов delete[]
(вместо delete
), следовательно, приводит к неопределенному поведению.
Как правило, никогда не используйте голые указатели. Если вы используете голые указатели, всегда используйте ту же форму для delete
, что и для new
.
Как указано в комментариях, в современном C ++ у никогда не должно быть контейнера полный голых указателей (голые указатели - это указатели, которые не управляются объектом-оболочкой, использующим RAII).
Поэтому вы должны использовать что-то вроде std::unique_ptr<B>
или std::shared_ptr<B>
вместо B*
в вашем векторе. Вы также не должны иметь указатель std::vector
и должны вместо этого скопировать или переместить (если копирование дорогое) вектор на место. Используйте умные указатели вместо голых указателей, и это , мы надеемся, больше не повторится: p.