Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
OdessaNA
 Аватар для OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 240
30.12.2012, 14:47     Ошибка при выделении памяти #1
Здравствуйте, друзья.
Подскажите, пожалуйста, почему выскакивает ошибка при повторном выделении память (ведь память в куче удаляется перед выделением)?
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();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 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 Посмотреть сообщение
память в куче удаляется
В том то и дело, что у тебя все что можно удаляется...
OdessaNA
 Аватар для OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 240
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;
    }
выводит на экран "мусор".
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.12.2012, 16:18     Ошибка при выделении памяти #4
Цитата Сообщение от OdessaNA Посмотреть сообщение
temp выделятся новый участок памяти, и ни разу не удаляется
Остается только тот массив, под который память была выделена на последней итерации. Остальное все удаляется с помощью delete.

Цитата Сообщение от OdessaNA Посмотреть сообщение
Объясните, пожалуйста, почему удалая выделенную память под массив array, удаляется память под массив temp?
После того, как мы сделали:
C++
1
array = temp;
они просто указывают на одну и ту же область памяти, в array и temp - лежат одинаковые адреса. Присвоение одного указателя другому не копирует никакие элементы массива.
OdessaNA
 Аватар для OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 240
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, спасибо!
Yandex
Объявления
30.12.2012, 16:43     Ошибка при выделении памяти
Ответ Создать тему
Опции темы

Текущее время: 04:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru