Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
#1

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

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

Здравствуйте, друзья.
Подскажите, пожалуйста, почему выскакивает ошибка при повторном выделении память (ведь память в куче удаляется перед выделением)?
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2012, 14:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при выделении памяти (C++):

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

Ошибка при выделении памяти - C++
Когда убираю free(buf), то ошибки нету, а когда есть, то вылазит ошибка. Почему такое происходит? #include &lt;stdlib.h&gt; #include...

Ошибка при динамическом выделении памяти - C++
Я не понимаю почему, но почему-то пример по динамическому выделению памяти, взятый с этой веб-страницы: http://cppstudio.com/post/9555/...

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

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

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

4
Schizorb
510 / 462 / 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 Посмотреть сообщение
память в куче удаляется
В том то и дело, что у тебя все что можно удаляется...
1
OdessaNA
19 / 19 / 0
Регистрация: 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
Schizorb
510 / 462 / 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 - лежат одинаковые адреса. Присвоение одного указателя другому не копирует никакие элементы массива.
1
OdessaNA
19 / 19 / 0
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2012, 16:43
Привет! Вот еще темы с ответами:

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

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

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

Ошибка в выделении памяти - C++
проблема с выделением памяти. ошибку никак найти не могу, поможет кто исправить? #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using...


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

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

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