1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 8
1

Ошибка при выполнении функции (std::bad_alloc at memory location)

16.03.2015, 15:01. Показов 4013. Ответов 3
Метки нет (Все метки)

При выполнении функции выскакивает ошибка:
Unhandled exception at 0x77b815de in SII_V1_Lab2.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0040ea80..
Что функция должна делать:
-считывать данные из бинарного файла в структуру
-выводить отсортированные и отформатированные данные из структуры
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
void showbin() {
    char binname[50];
    cout<<"Введите имя бинарного файла: "; cin >> binname;
        cout<<"Вывод бинарного файла:\n";
        student **tmp = new student*[3];
    ifstream fin(binname, ios::binary);
    for(int i = 0; i < 3; ++i) {
    fin.read((char *)&tmp[i], sizeof(student));
    }
    for (int i=0; i<3; i++){
        if (average(tmp[i]->marks)>=4){
        ostringstream  mystr;
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::left)<<setw(15)<<setfill('.')<< tmp[i]->name;
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::right)<<setw(8)<<setfill('.')<< tmp[i]->number << "\n";
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::left)<<setw(14)<<setfill('.')<<"Marks:";
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::right)<<setw(8)<<setfill('.');
            for (int k = 0; k < 5; k++) {
            mystr <<resetiosflags(ios::right)<<setiosflags(ios::right)<<setw(1)<<setfill('.')<< tmp[i]->marks[k] << " ";
        }
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::left)<<setw(16)<<setfill('.')<<"\nAverage:";
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::right)<<setw(8)<<setfill('.')<<average(tmp[i]->marks);
        cout<<mystr.str();
        
        cout<<endl<<endl;;
        }
    }
    fin.close();
    }
Она выполняет поставленную задачу, но вылазит эта ошибка. Я так понимаю ей не хватает памяти, но в упор не вижу почему. Надеюсь, что кто-нибудь поможет горе-кодеру.
Миниатюры
Ошибка при выполнении функции (std::bad_alloc at memory location)  
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2015, 15:01
Ответы с готовыми решениями:

Ошибка при написании класса: Unhandled exception std::bad_alloc at memory location
ПИшу свой клас Var, проблема в следующем из-за строчки first = first+1; вылетает ошибка ...

Ошибка bad_alloc at memory location
Мне нужно создать метод для обработки массива. И в методе мне нужно создать динамический массив...

Выдаёт ошибку "Unhandled exception at 0x00007F exception: std::bad_alloc in memory location"
Добрый день, друзья не могли бы помочь разобраться, почему выдаёт такую ошибку? Вот #include...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc выделение памяти
Уважаемые форумчане! Работаю над программой обработки WAV файлов, но возникла такая проблема: при...

3
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 8
16.03.2015, 15:08  [ТС] 2
Проблема решилась, когда увеличил
C++
1
student **tmp = new student*[3];
Странно, исходная структура, которую я копировал в бинарный файл была такого же размера, почему сейчас не хватило?
Исходная структура
C++
1
student **students = new student*[3];
Копирование в бин. файл
C++
1
2
3
4
5
6
ofstream fout("f.dat", ios::binary); 
    for(int i = 0; i < 3; ++i) 
    {      
        fout.write((char *)(&students[i]), sizeof(student));
    }
    fout.close();
0
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 8
16.03.2015, 16:35  [ТС] 3
Вот ещё появилась ошибка, когда удаляю созданные массивы структур. Если не удалять, то всё нормально.
Вся программа целиком.
Кликните здесь для просмотра всего текста
main.cpp
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
#include <string.h>
#include <iostream>
#include <conio.h>
#include <fstream>
#include <sstream>
#include <iomanip>
#include "functions.h"
#include "manipulators.h"
#include "description.h"
using namespace group;
int main() {
    setlocale(0,"");
    int n=3;
    student **students = new student*[3];
    setdata(students); //Ввод данных в структуру
    showdata(students); //Вывод
    //Запись структуры в бинарный файл//
    ofstream fout("f.dat", ios::binary); 
    for(int i = 0; i < 3; ++i) 
    {      
        fout.write((char *)(&students[i]), sizeof(student));
    }
    fout.close();
    //---------------------------------//
    
    //Чтение и вывод из бинарного файла//
    showbin();
    for (int i = 0; i < 3; i++)
{
  delete [] students[i];
}
delete [] students;
 
    system("Pause");
    return 0;
}

Кликните здесь для просмотра всего текста
functions.h
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <string.h>
#include <fstream>
#include <iostream>
#include <conio.h>
struct student {
        char name[25];
        int number;
        int marks[5];
    };
using namespace std;
 
namespace group {
    
 
    void inputmarks(int m[]) {
        cout << "   enter 5 marks: ";
        for (int k = 0; k < 5; k++) {
            cin >> m[k];
        }
        cout << endl;
    }
 
    void showmarks(int m[]) {
        cout << "marks: ";
        for (int k = 0; k < 5; k++) {
            cout << m[k] << " ";
        }
        cout << endl;
    }
    void showmarks1(int m[]) {
        for (int k = 0; k < 5; k++) {
            cout << m[k] << " ";
        }
        
    }
    double average(int m[]) {
        int sum = 0;
        for (int a = 0; a < 5; a++) {
            sum += m[a];
        }
        return sum / 5.0f;
    }
 
    void showmess() {
        cout << "Losers!";
    }
 
    void setdata(student** arr, int n = 3) {
        ofstream out("f.txt");
        for (int i = 0; i < n; i++) {
            arr[i] = new student;
 
            cout << "Enter information about " << i + 1 << " student" << endl;
            cout << "   name: ";
            cin.get(arr[i]->name, 24, '\n');
 
            cout << "   number: ";
            cin >> arr[i]->number;
 
            inputmarks(arr[i]->marks); cin.sync();
 
            //сортировка
            if (i > 0) {
                student* tptr = arr[i];
                for (int j = i - 1; j >= 0; j--) {
                    if (tptr->number < arr[j]->number) {
                        arr[j + 1] = arr[j];
                        if (j == 0) arr[j] = tptr;
                    }
                    else if (j < i - 1) {
                        arr[j + 1] = tptr; break;
                    }
                    else break;
                }
            }
        }
    }
 
    void showdata(student** arr, int n = 3) {
        bool showmessage = true;
        for (int i = 0; i < n; i++) {
            if (average(arr[i]->marks) >= 4) {
                showmessage = false;
                cout << endl << "   Group " << arr[i]->number << endl
                    << "name: " << arr[i]->name << endl;
                showmarks(arr[i]->marks);
                cout << "average: " << average(arr[i]->marks) << endl << endl;
            }
        }
        if (showmessage) showmess();
    }
    void showbin() {
        char binname[50];
    cout<<"Введите имя бинарного файла: "; cin >> binname;
        cout<<"Вывод бинарного файла:\n";
        student **tmp = new student*[3];
        for (int i = 0; i < 3; i++) {
            tmp[i] = new student;
        }
    ifstream fin(binname, ios::binary);
    for(int i = 0; i < 3; ++i) {
    fin.read((char *)&tmp[i], sizeof(student));
    }
    for (int i=0; i<3; i++){
        if (average(tmp[i]->marks)>=4){
        ostringstream  mystr;
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::left)<<setw(15)<<setfill('.')<< tmp[i]->name;
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::right)<<setw(8)<<setfill('.')<< tmp[i]->number << "\n";
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::left)<<setw(14)<<setfill('.')<<"Marks:";
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::right)<<setw(8)<<setfill('.');
            for (int k = 0; k < 5; k++) {
            mystr <<resetiosflags(ios::right)<<setiosflags(ios::right)<<setw(1)<<setfill('.')<< tmp[i]->marks[k] << " ";
        }
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::left)<<setw(16)<<setfill('.')<<"\nAverage:";
        mystr <<resetiosflags(ios::right)<<setiosflags(ios::right)<<setw(8)<<setfill('.')<<average(tmp[i]->marks);
        cout<<mystr.str();
        
        cout<<endl<<endl;;
        }
    }
    fin.close();
        for (int i = 0; i < 3; i++)
{
  delete [] tmp[i];
}
delete [] tmp;
    }
    
}
Миниатюры
Ошибка при выполнении функции (std::bad_alloc at memory location)  
0
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 8
16.03.2015, 19:40  [ТС] 4
Исправил создание структур
C++
1
2
3
4
student **students = new student*[3];
for (int i = 0; i < n; i++) {
            students[i] = new student;
}
На
C++
1
student *students = new student[3];
Удаление:
C++
1
delete [] students;
И размеры теперь совпадают
C++
1
student *tmp = new student[3];
Заработало!
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2015, 19:40
Помогаю со студенческими работами здесь

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Есть задача: Написать программу, которая считывает текст из файла и выводит его на экран, заменив...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Добрый день!Работаю с графами,и при больших значениях столкнулся с проблемой:ошибка в тесте...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
При выполнении программы, которая миксует функции в которых создаются типовые задачи, вылезает...

Std::invalid_argument at memory location 0x004ff460|Visual Studio
Ребята кто може помочь написал вот програму запускаю и тут вылетает https://**********/a/QvQhCM3...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru