Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
28 / 13 / 1
Регистрация: 20.01.2013
Сообщений: 145
Записей в блоге: 8
1

Нехватка памяти при создании динамических объектов

25.01.2015, 21:07. Показов 1667. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создаю 4 динамических объекта. 3 вектора и матрица. матрица - это результат перемножения двух векторов. третий вектор- это суммы элементов матрицы по диагоналям. при компиляции компилятор (ide dev-c++) вылетает с ошибкой (terminate called after throwing an instance of 'std::bad_alloc' what(): srd::bad_alloc), система ругается на нехватку памяти. Со статическими объектами (когда размеры векторов и матрицы заданы статически), все работает нормально.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2015, 21:07
Ответы с готовыми решениями:

Нехватка памяти при выбросе исключения
Собственно, наткнулся на проблему //Если здесь для создания std::string не хватит памяти, то...

Нехватка памяти при чтении/записи файлов
Всем привет! Возникла проблема при работе программы, которая должна открывать текстовый файл,...

Инициализация динамических массивов при создании
как создавать динамические массивы,чтоб вводить данные с клавиатуры знаю.. примерно это выглядит...

Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти
Не скажу за все ОС-и, но под Windows есть менеджер памяти. Когда по ходу кода встречается new, ну...

9
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
25.01.2015, 21:11 2
dserp18, код выкладывайте.
0
28 / 13 / 1
Регистрация: 20.01.2013
Сообщений: 145
Записей в блоге: 8
25.01.2015, 21:42  [ТС] 3
ну, не векторы - динамические массивы

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
53
#include <iostream>
using namespace std;
int main()
{
     int n;    
    int *arr1 = new int[n];
    int *arr2 = new int[n]; 
   int *vect = new int[n]; 
   int **matrix = new int* [n]; 
    for (int count = 0; count < n; count++)
   matrix[count] = new int [n]; // ïÿòü ñòîëáöîâ  
    cout << "Enter size of array: ";
    cin >> n; 
    cout<<endl;
  
     for (int i = 0; i < n; i++) {
        
       arr1[i] = i+1;
       arr2[i] = i+4;
       //заполняю vect нулями
      vect[i] = 0;
       }
 for (int i = 0; i <n ; i++)
  {
    for (int j = 0; j < n; j++)
    {
         matrix[i][j]= arr2[i]*arr1[j];
         cout<< matrix[i][j]<<" ";
    }cout<< endl;
    }
        cout << endl;
//vect-это суммы элементов матрицы
//по диагоналям  
 for (int i = 0; i < n ; i++)
  {    for (int j = 0; j < n; j++)    {
    if (i+j<3) {
vect[i]=vect[i]+matrix[j][j+i];
     }
  }
}
for (int i = 0; i < n ; i++){
    cout<<vect[i]<<" ";
}
  
 
    delete [] arr1; 
    delete [] arr2;
    delete [] vect;
    for (int count = 0; count < n; count++)
        delete [] matrix[count];
   
    return 0;
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.01.2015, 21:53 4
dserp18, n чему равно? Сколько памяти ты хочешь выделить в строках с 6-й по 9-ю (включительно)?
1
28 / 13 / 1
Регистрация: 20.01.2013
Сообщений: 145
Записей в блоге: 8
25.01.2015, 22:59  [ТС] 5
Да, спасибо, работает. А можно по другому как-нибудь инициализировать vect, а не заполнять нулями?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.01.2015, 23:09 6
Цитата Сообщение от dserp18 Посмотреть сообщение
А можно по другому как-нибудь инициализировать vect, а не заполнять нулями?
Можно чем угодно его заполнить. Что тебе мешает?
0
28 / 13 / 1
Регистрация: 20.01.2013
Сообщений: 145
Записей в блоге: 8
25.01.2015, 23:55  [ТС] 7
Понял. А если мне надо удалить первый элемент из vect
C++
1
2
3
for (int i = 0; i < n ; i++){
    vect[i]=vect[i+1];
    }
в удаленный элемент записывается какая-то величина. Как мне уменьшить размер массива при удалении из него элемента?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
26.01.2015, 00:07 8
вариант 1: сдвигать все, что было перед первым элементом на одну позицию и запомнить где-то что массив стал на один элемент меньше. объем занимаемой памяти от этого не уменьшается.
вариант 2: перевыделить массив с нужным размером. и скопировать туда все из старого. старый удалить. достаточно медленный вариант.
вариант 3: использовать стандартные контейнеры. выбрать подходящий по требованиям. вектор - самый простой в вашем случае. будет примерно то же, что и вариант 1 в плане производительности, но геморроя в связи с динамическим размером будет сильно меньше.

вариант 4: другие варианты
1
28 / 13 / 1
Регистрация: 20.01.2013
Сообщений: 145
Записей в блоге: 8
27.01.2015, 15:28  [ТС] 9
а как создать матрицу векторов? использую vector< vector <int> >.программа зависает .
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
#include <iostream>
#include <vector>
using namespace std;
int main()
{
     int n;    
    cout << "Enter size of array: ";
    cin >> n; 
    cout<<endl;
    std::vector<int> v1(n);
    std::vector<int> arr1(n);
    std::vector<int> arr2(n);
     //объявление матрицы векторов
      vector< vector <int> > matrix;//видимо нужно указать размер matrix
        for (int i = 0; i < n; i++) {
        arr1[i] = i+1;
        arr2[i] = i+4;
      }
  for (int i = 0; i <matrix.size() ; i++)
  {    for (int j = 0; j < matrix.size(); j++)
    {
     matrix[i][j]=arr2[i]*arr1[j];
     cout<< matrix[i][j]<<" ";
    }   cout << endl;
  }     cout << endl;
for (int i = 0; i < n ; i++)
  {    for (int j = 0; j < n; j++)    {
    if (i+j<n) {
//v1-это суммы элементов матрицы
//по диагоналям  
v1[i]=v1[i]+matrix[j][j+i];
cout<<v1[i]<<endl;
     }  } }
for (int i = 0; i < v1.size() ; i++){
    cout<<v1[i]<<" ";}
        cout<<endl;
      return 0;
}
Добавлено через 33 минуты
может boost::multi_array?
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
27.01.2015, 15:37 10
dserp18,
C++
1
2
3
4
5
vector< vector <int> > matrix(n);//видимо нужно указать размер matrix
for (int i = 0; i < n; i++) {
    arr1[i] = i+1;
    arr2[i] = i+4;
}
Добавлено через 2 минуты
dserp18,
C++
1
2
3
4
5
6
7
  for (int i = 0; i <matrix.size() ; i++)
  {    for (int j = 0; j < matrix.size(); j++)
    {
     matrix[i].push_back(arr2[i]*arr1[j]);
     cout<< matrix[i][j]<<" ";
    }   cout << endl;
  }     cout << endl;
1
27.01.2015, 15:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2015, 15:37
Помогаю со студенческими работами здесь

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

Нехватка памяти
Здравствуйте) пытаюсь выделить память под массив из 15345000 элементов, при запуске выскакивает...

Call of nonfunction при создании массива объектов класса
Здравствуйте, мне нужен массив объектов класса Contact. На последней строке в cpp выдает ошибку...

Stack overflow при создании большого количества объектов
Здравствуйте Товарищи! Выскакивает ошибка:&quot;Необработанное исключение в &quot;0x000000013fbc1ba7&quot; в...


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

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