Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для Rickk
2 / 2 / 1
Регистрация: 17.12.2013
Сообщений: 58

Std::bad_alloc при суммировании матрицы

02.01.2015, 23:32. Показов 859. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некий класс матрицы.
Конструктор, деструктор
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
Matrix (size_t a, size_t b, bool is_rand = true, bool writte = true)
            : date(new Type *[a]), a_size(a), b_size(b)
    {
        for (size_t i = 0; i != a; ++i) {
            date[i] = new Type [b];
        }
        if(is_rand==true) {
            this->addRandElement();
        } else {
            for (int j = 0; j < a; ++j) {
                for (int i = 0; i < b; ++i) {
                    date[j][i]=0;
                }
            }
        }
        if(writte== true) {
            this->writte();
        }
    }
    ~Matrix() {
        for (int i = 0; i != a_size; ++i) {
            delete  []date[i];
        }
        delete []date;
    }
Оператор=
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Matrix &operator= (Matrix const &a) {
        if(this!=&a) {
            this->~Matrix();
            a_size = a.a_size;
            b_size  = a.b_size;
            date = new Type *[a_size];
            for (int i = 0; i != a_size; ++i) {
                date[i] = new Type [b_size];
            }
            for (int j = 0; j != a_size; ++j) {
                for (int i = 0; i != b_size; ++i) {
                    date[j][i] = a.date[j][i];
                }
            }
        }
        return  * this;
 
    }
И само суммирование
C++
1
2
3
4
5
6
7
Matrix operator+ (Matrix const &T) {
        for (int i = 0; i != a_size; ++i) {
            for (int j = 0; j != b_size; ++j) {
                this->date[i][j] = date[i][j]+T.date[i][j];
            }
        }
    }

Делаю
C++
1
2
3
Matrix <int> k(5,5);
    Matrix <int> l(5,5);
   l = k+l;
Ошибок компиляции нету.
Но получаю This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc

Что-то я намудрил во всем этом, но что понять не могу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.01.2015, 23:32
Ответы с готовыми решениями:

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

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

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

5
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
03.01.2015, 00:12
Во-первых, не могли бы вы либо предоставить полностью листинги класса и вызова, либо - предоставить единым файлом листинг, минимально необходимый, для воспроизведения проблемы. Во-вторых, кидает эксепшн он на операции k + l; или на операции присваивания? В третьих, из того что я вижу сразу -
C++
1
2
       if(this!=&a) {
            this->~Matrix();
для чего явный вызов деструктора?

C++
1
2
3
4
5
6
 ~Matrix() {
        for (int i = 0; i != a_size; ++i) {
            delete  []date[i];
        }
        delete []date;
    }
нет зануления указателей на освобождаемую память - особенно актуально, когда вы используете деструктор явным образом

Скорее всего косяк где-то тут:
C++
1
2
3
4
5
b_size  = a.b_size;
            date = new Type *[a_size];
            for (int i = 0; i != a_size; ++i) {
                date[i] = new Type [b_size];
            }
а именно, если а.b_sizе - окажется не инициализирован (там будет мусор условно говоря) то new попытается выделить ну скажем много-много байт памяти, и выкенет эксепшн, из-за того что столько нету.
Еще 1 вариант - все ваши операции, которые выделяют память ( сначала при помощи new - потом при помощи контейнеров - если таковые используются) проверить дебагом на то, какие куски памяти у них запрашиваются. Проверить, все ли элементы получают корректные значения.

Добавлено через 2 минуты
На всякий случай, чтоб вы понимали куда рыть http://www.cplusplus.com/reference/new/bad_alloc/

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
Matrix operator+ (Matrix const &T) {
        for (int i = 0; i != a_size; ++i) {
            for (int j = 0; j != b_size; ++j) {
                this->date[i][j] = date[i][j]+T.date[i][j];
            }
        }
    }
Вы ничего не возвращаете из метода, который должен вернуть матрицу? там шалапуша вместо матрицы забитая черти чем?

Добавлено через 14 минут
Можно почитать на счет перегрузки операторов в канонической форме:
http://stackoverflow.com/quest... verloading
http://en.cppreference.com/w/c... /operators
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.01.2015, 22:17
Rickk, в предоставленном коде я проблем не вижу. Где-нибудь еще память выделяется по средствам оператора new?

Цитата Сообщение от Melg Посмотреть сообщение
а именно, если а.b_sizе - окажется не инициализирован
Он в конструкторе явно инициализируется.
0
 Аватар для Rickk
2 / 2 / 1
Регистрация: 17.12.2013
Сообщений: 58
03.01.2015, 22:36  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Rickk, в предоставленном коде я проблем не вижу. Где-нибудь еще память выделяется по средствам оператора new?
Да
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Matrix (Matrix &a)
            : a_size(a.a_size), b_size(a.b_size)
    {
        date = new Type *[a_size];
        for (size_t i = 0; i != a_size; ++i) {
            date[i] = new Type [b_size];
        }
        for (int i = 0; i != a_size; ++i) {
            for (int j = 0; j != b_size; ++j) {
                date[i][j] = a.date[i][j];
            }
        }
    }
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.01.2015, 23:12
Увы, но тут я тоже не вижу проблем.
Rickk, можно код целиком?
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
03.01.2015, 23:35
Еще раз, по-вашему этот код сложения матриц:
C++
1
2
3
4
5
6
7
Matrix operator+ (Matrix const &T) {
        for (int i = 0; i != a_size; ++i) {
            for (int j = 0; j != b_size; ++j) {
                this->date[i][j] = date[i][j]+T.date[i][j];
            }
        }
    }
является корректным? Я не вижу тут return-а. И настаиваю на том, что его наличие необходимо. Насколько я себе представляю - после сложения возвращается некоторый объект, который заполнен некорректными значениями, и благодаря которому, при выполнении оператора присваивания происходит попытка выделить блок памяти недопустимого размера.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.01.2015, 23:35
Помогаю со студенческими работами здесь

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

Ошибка terminate called after throwing an instance of 'std::bad_alloc' при работе с типом std::string
Добрый вечер, при работе функции возникает ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): ...

Ошибка при выполнении функции (std::bad_alloc at memory location)
При выполнении функции выскакивает ошибка: Unhandled exception at 0x77b815de in SII_V1_Lab2.exe: Microsoft C++ exception: std::bad_alloc...

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

std::bad_alloc
Сразу оговорюсь, что пришёл в C++ из JavaScript, поэтому прошу сильно не бить. Суть в следующем: у нас есть 2 массива из bool (точнее 2...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru