С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
1

Ошибка при выделении памяти

30.12.2012, 14:47. Показов 3057. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, друзья.
Подскажите, пожалуйста, почему выскакивает ошибка при повторном выделении память (ведь память в куче удаляется перед выделением)?
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
       #include <iostream>
       #include <conio.h>
        using namespace std;
 
    void main()
{
    int meter = 0;
    int *array = new int [1];
    int var = 0;    
    int *temp;
    while(meter < 5)
    {
        cin >> var;
        array[meter++] = var;
 
        temp = new int [meter + 1];
 
        for(int i = 0; i < meter; ++i)
            temp[i] = array[i];
 
        delete [] array;
 
        array = new int [meter + 1];
        array = temp;
 
        delete [] temp;
    }
 
    for (int i = 0; i < meter; i++)
    {
        cout << array[i] << ' ';
    }
 
    delete [] array;
 
    _getch();
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Блог
30.12.2012, 14:47
Ответы с готовыми решениями:

Ошибка при выделении памяти
Вопрос: из-за чего программа может рушится? int *NRRow = new int ; int *NRow = new int ; int...

Ошибка при выделении памяти
Когда убираю free(buf), то ошибки нету, а когда есть, то вылазит ошибка. Почему такое происходит? ...

Ошибка при динамическом выделении памяти
почему у меня возникет ошибка вот тут struct TOVAR *New = new struct TOVAR; пишит недопустимый...

Ошибка при динамическом выделении памяти
Я не понимаю почему, но почему-то пример по динамическому выделению памяти, взятый с этой...

4
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
30.12.2012, 15:46 2
Не очень понял, что тебе нужно. Мб так?
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
int main()
{
    int meter = 0;
    int * array;
    int var = 0;    
    int * temp;
    while(meter < 5)
    {
        cin >> var;
 
        temp = new int [meter + 1]; // выделили память под новый массив
 
        for(int i = 0; i < meter; ++i) // скопировали старые значения
            temp[i] = array[i];
            
        temp[meter++] = var;    // добавили новое значение в конец
 
        delete [] array;   // удалили старый массив
 
        array = temp;  // присвоили arr адрес нового массива
    }
 
    for (int i = 0; i < meter; i++)
    {
        cout << array[i] << ' ';
    }
 
    delete [] array;
}
Добавлено через 39 секунд
Цитата Сообщение от OdessaNA Посмотреть сообщение
память в куче удаляется
В том то и дело, что у тебя все что можно удаляется...
1
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
30.12.2012, 16:16  [ТС] 3
Фактически - оно работает, но как я понимаю - в при каждом выполнении цикла под массив temp выделятся новый участок памяти, и ни разу не удаляется?
При завершении цикла массив temp существует:
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
#include <iostream>
#include <conio.h>
using namespace std;
 
void main()
{
    int *array = new int [3];
 
 
    int meter = 0;
    int var = 0;    
    int * temp;
    while(meter < 5)
    {
        cin >> var;
 
        temp = new int [meter + 1]; // выделили память под новый массив
 
        for(int i = 0; i < meter; ++i) // скопировали старые значения
            temp[i] = array[i];
            
        temp[meter++] = var;    // добавили новое значение в конец
 
        delete [] array;   // удалили старый массив
 
        array = temp;  // присвоили arr адрес нового массива
    }
 
    for (int i = 0; i < meter; i++)
    {
        cout << array[i] << ' ' << temp[i] << endl;
    }
 
    delete [] array;
 
    cout << endl << "END";
 
    _getch();
}
Добавлено через 8 минут
Епт., не успел отредактировать.
Объясните, пожалуйста, почему удалая выделенную память под массив array, удаляется память под массив temp?
C++
1
2
3
4
5
6
delete [] array;
    
     for (int i = 0; i < meter; i++)
    {
        cout << array[i] << ' ' << temp[i] << endl;
    }
выводит на экран "мусор".
0
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
30.12.2012, 16:18 4
Цитата Сообщение от OdessaNA Посмотреть сообщение
temp выделятся новый участок памяти, и ни разу не удаляется
Остается только тот массив, под который память была выделена на последней итерации. Остальное все удаляется с помощью delete.

Цитата Сообщение от OdessaNA Посмотреть сообщение
Объясните, пожалуйста, почему удалая выделенную память под массив array, удаляется память под массив temp?
После того, как мы сделали:
C++
1
array = temp;
они просто указывают на одну и ту же область памяти, в array и temp - лежат одинаковые адреса. Присвоение одного указателя другому не копирует никакие элементы массива.
1
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
30.12.2012, 16:43  [ТС] 5
Вот теперь я понял!

Моя ошибка была здесь

C++
1
2
3
4
5
6
delete [] array;
 
        array = new int [meter + 1];
        array = temp;
 
        delete [] temp;

Schizorb, спасибо!
0
30.12.2012, 16:43
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
30.12.2012, 16:43
Помогаю со студенческими работами здесь

Ошибка при выделении памяти с помощью malloc
Помогите выдает ошибку в рядочке :&quot;Ar = ( far *)malloc(size*sizeof(int));&quot; полный текст програмы:...

Иерархия классов. Ошибка при выделении памяти
Добрый день. Пишу класс Транспортное средство. Столкнулся с несколькими ошибками. Программа...

Ошибка при выделении памяти динамически для структуры
Есть программа. Вылетает ошибка. Если gets(BLOCKNOTE.NAME) заменить на cin&gt;&gt;BLOCKNOTE.NAME все...

Ошибка при выделении памяти под двумерный массив
#include &lt;iostream&gt; using namespace std; class array { int size1, size2; char **matr;...

Ошибка при выделении памяти под вектор методом resize
Всем добрый день! Возник следующий вопрос: выделяю память для вектора с помощью метода resize(w*h)....

Почему не вылетает ошибка при выделении памяти под динамический массив, размером 100 Гб?
Здравствуйте, знатоки! Столкнулся с проблемой выделения памяти под динамические массивы. При...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru