Я делаю хэш-сет для школы. У меня есть массив типа «LinkedList», используемый для цепочки. Я написал свой код на Mac и скомпилировал с помощью clang ++, все работает и работает нормально (с утечками памяти, но я исправлю их). Проблема, с которой я сталкиваюсь — это компиляция в Ubuntu Linux с g ++. Я получаю ошибку неверного размещения. При запуске в valgrind говорится, что условный переход или перемещение зависит от неинициализированных значений. И говорит, что ошибка исходит из следующего раздела:
LinkedList<ItemType>* table;
.
.
.
HashSet () :
size(0),
tableSize(0),
table(new LinkedList<ItemType> [size])
{}
Я подозреваю, что ошибка заключается в построении таблицы. Если я изменяю размер на 5 (или любое другое число больше 0), я получаю ту же ошибку, другими словами, я не думаю, что создание массива размера 0 является проблемой. Любые идеи о том, как это исправить? У меня нет конструктора копирования в моем классе LinkedList, инициализация таблицы вызывает конструктор копирования или стандартный конструктор по умолчанию?
Порядок инициализации определяется не порядком инициализаторов в списке инициализации конструктора, а порядком, в котором члены объявляются в теле класса.
Если size
объявлено ниже table
затем он инициализируется нулем после выделения памяти. Тем временем table
инициализируется, size
по-прежнему содержит случайный мусор, и вы выделяете массив некоторого случайного размера. Ваш код демонстрирует неопределенное поведение.
Вы можете решить проблему, просто написав table(new LinkedList<ItemType>[0])
, Тем не менее, не ясно, зачем вам выделять массив нулевого размера. Как вы думаете, что хорошего в этом?
Вместо использования необработанного массива и управления памятью вручную, рассмотрите возможность использования std::vector<LinkedList>
, А также std::list
вместо доморощенного LinkedList
, для хорошей меры.
Других решений пока нет …