Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
gres8
0 / 0 / 0
Регистрация: 26.10.2016
Сообщений: 61
1

Удаление последнего элемента динамического массива (программа вылетает с ошибкой)

02.12.2016, 20:56. Просмотров 1092. Ответов 11
Метки нет (Все метки)

C++ (Qt)
1
2
3
4
5
for (vector<P>::iterator i = p.begin(); i != p.end(); ++i)
    {
            i -> life --;
            if (i -> life ==0) p.erase(i);
    }
смыл сего кода удалить элемент когда в параметре life 0 то есть клетка умерла
так вот пока элементов больше 1 то все они исчезают то есть пусть будет 400 и потихоньку они уменьшаются (удаляются)
но когда остается 1 клетка и жизнь подходит к концу программа выдет ошибку
ПРЕКРАЩЕНИЕ РАБОТЫ ПРОГРАММЫ

Process returned -1073741819 <0xC0000005>
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2016, 20:56
Ответы с готовыми решениями:

При обращении к индексу двумерного массива char программа вылетает с ошибкой
Программа вылетает с ошибкой на 66й строке. Почему?((( // Task_1.cpp : Defines the entry point for...

Удаление элемента из динамического массива
Приветствую зашедших! Мне по условию дан динамический массив int элементов, в котором надо...

Добавление и удаление элемента динамического массива
Подскажите какие существую способы добавления и удалеия элемента одномерного динамического...

Запись и удаление элемента динамического массива
Такое дело: при вызове функции удаления набранной юзэром ячейки динамического массива удаляется......

Удаление элемента динамического массива справа
Нужно удалить последний структурный элемент динамического массива. помогите пожалуйста никак не...

11
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
02.12.2016, 21:02 2
Лучший ответ Сообщение было отмечено gres8 как решение

Решение

C++
1
2
3
4
5
6
for (vector<P>::iterator i = p.begin(); i != p.end();)
    {
            i -> life --;
            if (i -> life ==0) i = p.erase(i);
            else ++i;
    }
1
gres8
0 / 0 / 0
Регистрация: 26.10.2016
Сообщений: 61
02.12.2016, 21:04  [ТС] 3
ООО спасибки а почему вылетало??
0
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
02.12.2016, 21:05 4
Потому что итератор становится недействительным при удалении. Для этого и предусмотрен возврат. Документацию по erase() читай.
0
02.12.2016, 21:05
Miridan
0 / 0 / 0
Регистрация: 19.06.2016
Сообщений: 12
02.12.2016, 23:27 5
Ребят у меня вопрос попроще, не могу разобраться с удалением в одномерном динамическом массиве. Подскажите пожалуйста.
Дан массив с инициализированными элементами. Нужно удалить элемент №1. Собственно не могу совладать с оператором delete. Ниже код.
C++
1
2
3
4
5
6
7
8
9
10
#include<iostream>
using namespace std;
int main (){
    int n = 1;
    int *mas = new int [n];
    mas[0] = 4;
    mas[1] = 5;
    mas=mas+n;
    delete mas;
}
Как я понял, оператор delete работает с указателями. Я передвинул указатель на последний элемент, а затем расчитывал что будет высвобождена память занимаемая элементом, на который в данный момент указывает mas (то есть на последний элемент. Но программа не выполняется, вылезает ошибка.
0
obivan
Падаван С++
435 / 251 / 86
Регистрация: 11.11.2014
Сообщений: 891
Завершенные тесты: 2
03.12.2016, 00:27 6
Miridan, во первых вы выделяете память под 1 элемент а используете 2
Цитата Сообщение от Miridan Посмотреть сообщение
C++
1
int n = 1;
тут 1 элемент
Цитата Сообщение от Miridan Посмотреть сообщение
C++
1
2
mas[0] = 4;
mas[1] = 5;
а тут используете 2, вот эесепшен
0
Miridan
0 / 0 / 0
Регистрация: 19.06.2016
Сообщений: 12
03.12.2016, 02:12 7
В с++ нумерация элементов массива идет с 0. Поэтому если я задаю массив int mas [1], то на деле выделяется память под два элемента. Под элемент с номером 0 и элемент с номером 1.

Добавлено через 10 минут
Вы сдвинули мой вопрос и поэтому те, кто разбирается в этом могут его не увидеть и не ответить, поэтому я его продублирую и попрошу вас его больше не сдвигать:

Ребят у меня вопрос попроще, не могу разобраться с удалением в одномерном динамическом массиве. Подскажите пожалуйста.
Дан массив с инициализированными элементами. Нужно удалить элемент №1. Собственно не могу совладать с оператором delete. Ниже код.
C++
1
2
3
4
5
6
7
8
9
10
#include<iostream>
using namespace std;
int main (){
    int n = 1;
    int *mas = new int [n];
    mas[0] = 4;
    mas[1] = 5;
    mas=mas+n;
    delete mas;
}
Как я понял, оператор delete работает с указателями. Я передвинул указатель на последний элемент, а затем расчитывал что будет высвобождена память занимаемая элементом, на который в данный момент указывает mas (то есть на последний элемент. Но программа не выполняется, вылезает ошибка.
0
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
03.12.2016, 08:35 8
Цитата Сообщение от Miridan Посмотреть сообщение
В с++ нумерация элементов массива идет с 0. Поэтому если я задаю массив int mas [1]
Не путай индексацию и размер. При создании массива ты должен указать 2.
Цитата Сообщение от Miridan Посмотреть сообщение
Я передвинул указатель на последний элемент, а затем расчитывал что будет высвобождена память занимаемая элементом
Откуда ты это взял? Память можно освободить только целиком, а не по элементам. Сдвиг делай.
0
Miridan
0 / 0 / 0
Регистрация: 19.06.2016
Сообщений: 12
03.12.2016, 11:46 9
Цитата Сообщение от nmcf Посмотреть сообщение
Не путай индексацию и размер. При создании массива ты должен указать 2
Да, действительно. Поздно уже сидел, голова не варила.
Цитата Сообщение от nmcf Посмотреть сообщение
Откуда ты это взял? Память можно освободить только целиком, а не по элементам. Сдвиг делай
Ну, чтобы очистить память от всего массива, мы пишем delete [] mas; как я понимаю пустые квадратные скобки указывают на то, что нужно удалить весь массив. Значит, если их нет, то удаляется лишь тот элемент на который указывает "mas". Так понял я. А как это работает, прошу расскажите)) И поясните пожалуйста про какой сдвиг вы сказали.
0
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
03.12.2016, 12:48 10
Цитата Сообщение от Miridan Посмотреть сообщение
Так понял я
Откуда ты это взял? Удалить можно только весь блок.
Цитата Сообщение от Miridan Посмотреть сообщение
И поясните пожалуйста про какой сдвиг вы сказали.
Что тут объяснять? На место удаляемого присваиваешь значение следующего и так до конца, а последний элемент просто не используй.
0
Miridan
0 / 0 / 0
Регистрация: 19.06.2016
Сообщений: 12
03.12.2016, 15:01 11
спасибо за ответ.
0
sourcerer
04.12.2016, 12:03     Удаление последнего элемента динамического массива (программа вылетает с ошибкой)
  #12

Не по теме:

Цитата Сообщение от gres8 Посмотреть сообщение
ООО спасибки
ОАО Пазязьки :D

0
04.12.2016, 12:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2016, 12:03
Привет! Вот еще темы с ответами:

Запись и удаление элемента динамического массива
Приветствую всех форумчан (я наверное всем надоел, знаю, но помогите, плз :D) Проблема: С...

Удаление последнего элемента массива
Функция для удаления последнего элемента в массиве. укажите на ошибку пожалуйста, функция выдает...

Удаление последнего чётного элемента массива
Здравствуйте,помогите дописать программу,пожалуйста. Нужно,чтобы программа удаляла последний...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru