Проблема с реализацией массива динамического размера

Я пишу реализацию массива с динамическим размером. Код компилируется без ошибок, но элементы массива не копируются должным образом. Кажется, что они просто стираются (перезаписываются нулями). Попытка вызвать геттер для элемента массива вызывает segfault.

Массив содержит указатели на некоторые объекты базового класса; это основное различие между моим кодом и примерами, которые я искал.

Это функция:

// Pointer to array of pointers
SomeClass** mainArray = new SomeClass[1];
int numItems = 0;

void AddItemDynamic(SomeClass* newVal) {
    SomeClass** tempArray = new SomeClass*[numItems+1];
    // Copying pointers to bigger array
    for (int i = 0; i < numItems - 1; i++) {
        tempArray[i] = mainArray[i];
    }

    numItems++;
    // Adding the new value
    tempArray[numItems] = newVal;

    delete [] mainArray;
    mainArray = tempArray;
}


Код должен скопировать элементы массива, а затем переназначить указатель на вновь созданный массив. Вместо этого указатель, кажется, установлен на что-то другое.

SomeClass** mainArray = new SomeClass[1]; Что вы пытаетесь здесь сделать?
sjsam 07.04.2019 19:23

Почему бы вам не использовать вектор?

user2100815 07.04.2019 19:27

Почему вы создаете массив указателей вместо обычного массива?

UnholySheep 07.04.2019 19:29

Реализация безопасного и надежного динамического контейнера для исключений сложнее, чем вы думаете. К счастью, стандартная библиотека предоставляет std::vector, std::deque и другие контейнеры, которые тщательно протестированы и оптимизированы.

Ayxan Haqverdili 07.04.2019 19:34

Как упоминалось другими, в стандартной библиотеке С++ уже есть «динамические массивы», поэтому используйте их только для упражнений или заданий, извлеките из них уроки, а затем выбросьте их.

Some programmer dude 07.04.2019 19:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
5
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если в текущем массиве есть элемент numItems, то цикл

for (int i = 0; i < numItems - 1; i++)

скопирует один меньше, чем numItems элементов.

И когда вы добавляете новый элемент, вы выходите за границы нового массива, потому что вы увеличиваете numItems до раннего.

Итак, две ошибки в одной и той же функции, по одной в каждом направлении.

И, как упоминалось в комментарий (спасибо Ayxan), первая ошибка «отклонение на единицу» будет означать, что при первом вызове этой функции два цикл копирования не произойдет. Это на самом деле хорошо, когда вы делаете это в первый раз, так как тогда нечего копировать, но во второй раз должно быть что-то для копирования, и все же цикл (в настоящее время) не запустится.

А учитывая, что numItems инициализируется нулем, он, вероятно, становится отрицательным, и тело цикла полностью пропускается. Следовательно, все значения в массиве равны нулю.

Ayxan Haqverdili 07.04.2019 19:40

Спасибо за четкий ответ, это именно то, что было неправильно. Результат копирования-вставки кода без его надлежащего прочтения; урок выучен.

cdfizz7 08.04.2019 03:00

Другие вопросы по теме