Хэш C ++ установил плохое размещение с новым

Я делаю хэш-сет для школы. У меня есть массив типа «LinkedList», используемый для цепочки. Я написал свой код на Mac и скомпилировал с помощью clang ++, все работает и работает нормально (с утечками памяти, но я исправлю их). Проблема, с которой я сталкиваюсь — это компиляция в Ubuntu Linux с g ++. Я получаю ошибку неверного размещения. При запуске в valgrind говорится, что условный переход или перемещение зависит от неинициализированных значений. И говорит, что ошибка исходит из следующего раздела:

LinkedList<ItemType>* table;
.
.
.
HashSet () :
size(0),
tableSize(0),
table(new LinkedList<ItemType> [size])
{}

Я подозреваю, что ошибка заключается в построении таблицы. Если я изменяю размер на 5 (или любое другое число больше 0), я получаю ту же ошибку, другими словами, я не думаю, что создание массива размера 0 является проблемой. Любые идеи о том, как это исправить? У меня нет конструктора копирования в моем классе LinkedList, инициализация таблицы вызывает конструктор копирования или стандартный конструктор по умолчанию?

0

Решение

Порядок инициализации определяется не порядком инициализаторов в списке инициализации конструктора, а порядком, в котором члены объявляются в теле класса.

Если size объявлено ниже tableзатем он инициализируется нулем после выделения памяти. Тем временем table инициализируется, size по-прежнему содержит случайный мусор, и вы выделяете массив некоторого случайного размера. Ваш код демонстрирует неопределенное поведение.

Вы можете решить проблему, просто написав table(new LinkedList<ItemType>[0]), Тем не менее, не ясно, зачем вам выделять массив нулевого размера. Как вы думаете, что хорошего в этом?

Вместо использования необработанного массива и управления памятью вручную, рассмотрите возможность использования std::vector<LinkedList>, А также std::list вместо доморощенного LinkedList, для хорошей меры.

2

Другие решения

Других решений пока нет …