Вы не реализовали конструктор копирования и оператор назначения копирования (см. Правило трех).Это приводит к неглубокой копии указателей в вашем векторе, вызывая двойное удаление и утверждение.РЕДАКТИРОВАНИЕ: Двойное удаление - неопределенное поведение, поэтому и VS, и gcc здесь верны, им разрешено делать все, что они захотят.
Обычно, когда вы реализуете деструктор с нетривиальным поведением, вам также нужно написатьили отключите конструкцию копирования и назначение копирования.
Однако в вашем случае вам действительно нужно хранить элементы по указателю?Если нет, просто сохраните их по значению, и это решит проблему.В противном случае, если вам нужны указатели, используйте shared_ptr
(из вашего компилятора или надстройки) вместо необработанных указателей, чтобы избавить вас от необходимости писать собственные методы деструктора / копирования.
РЕДАКТИРОВАТЬ: Еще одно примечание о вашем интерфейсе:Подобные интерфейсы, которые передают владение передаваемыми указателями, могут вызвать путаницу у людей, использующих ваш классЕсли кто-то передал адрес int, не выделенный в куче, то ваш деструктор все равно потерпит неудачу.Лучше либо принять по значению, если это возможно, либо клонировать переданный элемент, сделав собственный вызов new
в функции add
.