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

Ошибка при освобождении памяти

24.10.2014, 11:33. Просмотров 892. Ответов 9
Метки нет (Все метки)

Здравствуйте! Пишу на MS Visual C++ 2010, windows 7.
При вызове функции resize() на строке
C++
1
delete [] arr;
происходит ошибка, аварийный останов.
Что я делаю неправильно?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <cstddef>
 
class ArrInt {
public:
    explicit ArrInt() {
        size_ = 10;
        arr = new int[size_];
        for(size_t i=0; i<=size_; ++i)
            arr[i] = i;
    }
 
    ArrInt(int n) {
        size_ = n;
        arr = new int[size_];
        for(size_t i=0; i<=size_; ++i)
            arr[i] = i;
    }
 
    ~ArrInt() {
        //cout<<"destructor"<<endl;
        //delete [] arr; 
        //arr = 0;
    }
 
    void print() const {
        for(size_t i=0; i<size_; ++i)
            cout<<arr[i]<<endl;
    }
 
    void resize() {
        size_ *= 2;
        delete [] arr;
        arr = new int[size_];
        for(size_t i=0; i<=size_; ++i)
            arr[i] = i;
    }
 
private:
    int *arr;
    size_t size_;
};
 
int main() {
    ArrInt a1;
    a1.print();
    a1.resize();
    a1.print();
 
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2014, 11:33
Ответы с готовыми решениями:

Ошибка при освобождении памяти
Задача: Из стандартного входного потока вводятся сроки. Признаком завершения...

Ошибка при освобождении памяти?
Доброго времени суток! Я только-только взялся за изучение c++. Дошел до...

Ошибка при освобождении памяти
#include &lt;iostream&gt; using namespace std; #include &lt;stdlib.h&gt; #include...

Ошибка при освобождении памяти
Здравствуйте, программа завершает работу в этом коде #include &lt;iostream&gt;...

Ошибка при освобождении памяти
Все идет замечательно, но вот когда происходит удаление массива программа...

9
MakItSim
18 / 18 / 14
Регистрация: 23.09.2014
Сообщений: 117
24.10.2014, 11:41 2
Цитата Сообщение от Rahmat Посмотреть сообщение
i<=size_
просто <
Везде
0
Kuzia domovenok
2421 / 2151 / 525
Регистрация: 25.03.2012
Сообщений: 7,756
Записей в блоге: 1
24.10.2014, 11:42 3
выход за пределы массива
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4838 / 2483 / 695
Регистрация: 18.10.2014
Сообщений: 4,291
24.10.2014, 11:42 4
Лучший ответ Сообщение было отмечено Rahmat как решение

Решение

C++
1
2
3
arr = new int[size_];
for(size_t i=0; i<=size_; ++i)
   arr[i] = i;
Если массив был выделен с размером 'size_', то разрешенными индексами являются индексы от '0' до 'size_-1'. У вас же в коде происходит запись через индекс 'size_', т.е. за пределами выделенного массива. Это приводит к нарушению целостности динамической памяти и падению во время 'delete []'.
1
Kuzia domovenok
2421 / 2151 / 525
Регистрация: 25.03.2012
Сообщений: 7,756
Записей в блоге: 1
24.10.2014, 11:43 5
Цитата Сообщение от Rahmat Посмотреть сообщение
C++
1
for(size_t i=0; i<=size_; ++i)
C++
1
for(size_t i=0; i<size_; ++i)
0
ValeryS
Модератор
7376 / 5576 / 708
Регистрация: 14.02.2011
Сообщений: 18,959
24.10.2014, 11:45 6
а зачем ты добавил к конструктору без параметров explicit?
если создать класс так
C++
1
ArrInt a1(10);
будет ошибка?

Добавлено через 54 секунды
действительно выход за пределы, как то я просмотрел
0
Rahmat
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 6
24.10.2014, 11:57  [ТС] 7
Надо было ставить < (строго меньше). Проглядел. Спасибо всем! Вопрос закрыт.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4838 / 2483 / 695
Регистрация: 18.10.2014
Сообщений: 4,291
24.10.2014, 12:01 8
Цитата Сообщение от ValeryS Посмотреть сообщение
а зачем ты добавил к конструктору без параметров explicit?
'explicit' на конструкторе без параметров никакого эффекта не имеет. Это не ошибка, но смысла в этом нет никакого.
0
ValeryS
Модератор
7376 / 5576 / 708
Регистрация: 14.02.2011
Сообщений: 18,959
24.10.2014, 12:16 9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это не ошибка, но смысла в этом нет никакого.
вот про это я и спросил
причем на конструкторе с параметрами его нет
0
Rahmat
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 6
24.10.2014, 12:33  [ТС] 10
Учту!
0
24.10.2014, 12:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2014, 12:33

Ошибка при освобождении памяти
#include &lt;iostream&gt; using namespace std; template&lt;class T&gt; class pvector...

Ошибка при освобождении памяти
Добрый День! Написал простую программу для понимания сути. Проблема в том, что...

Ошибка при освобождении памяти
Здравствуйте. Знаю, что тема уже много раз поднималась в самых разнообразных...


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

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

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