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

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

Войти
Регистрация
Восстановить пароль
 
Charley
5 / 5 / 0
Регистрация: 11.06.2012
Сообщений: 173
#1

Почему new вызывает std::bad_alloc? - C++

27.10.2013, 19:20. Просмотров 870. Ответов 3
Метки нет (Все метки)

Скомпилил данные исходники в visual studio 2008. Получил ошибку в конструкторе whirlpool():
функция gf8mul умножает многочлены над полем 2^8:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//main.c
#include "stdafx.h"
#include "whirlpool.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
    whirlpool a(6), c(4);
    a.buffer[0]=0, a.buffer[1]=1, a.buffer[2]=1, a.buffer[3]=0, a.buffer[4]=1, a.buffer[5]=1;
    c.buffer[0]=1, c.buffer[1]=0, c.buffer[2]=0, c.buffer[3]=1;
    a.gf8mul(a, c);
    system("pause");
   return 0;
}
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
130
131
132
133
134
135
136
137
138
139
140
//whirlpool.cpp
#include "stdafx.h"
#include "whirlpool.h"
 
using namespace std;
 
bool whirlpool::isnull(whirlpool a)
    {
    int i;
    for (i=0; i<a.len; i++)
    {
        if (a.buffer[i]&1)
            return false;
    }
    return true;
    }
 
whirlpool whirlpool::operator<< (int k)
    {
        int i=0, j=0, old_len=len;
        int *temp = new int[len];
       
        for (i=0; i<old_len; i++)
            temp[i] = buffer[i];
        //удалить buffer
        buffer = new int[old_len+k];
        len=old_len+k;
 
        for (i=0; i<k; i++)
           buffer[i]=0;
 
        for (i=k; i<len; i++)
           buffer[i]=temp[i-k];
 
    return *this;
    }
 
whirlpool whirlpool::operator>> (int k)
    {
        int i, j;
 
        for (j=0; j<k; j++)
        {
            for (i=1; i<len; i++)
               buffer[i-1]=buffer[i];
 
            buffer[len-1]=0;
        }
        len=len-k;
        return *this;
    }
 
whirlpool whirlpool::operator=(whirlpool a)
{
    int i=0;
    len=a.len;
    for (i=0; i<len; i++)
        buffer[i]=a.buffer[i];
 
    return *this;
}
 
whirlpool operator^(whirlpool a, whirlpool b)
{
    int i, min_len=0, max_len=0;
    whirlpool temp,_a,_b;
    _a=a;
    _b=b;
 
    if (_a.len>_b.len)
    {
        min_len=_b.len;
        max_len=_a.len;
 
        for (i=0; i<min_len; i++)
            _a.buffer[i]=_a.buffer[i]^_b.buffer[i];
 
        temp=_a;
    } else
        {
            min_len=_a.len;
            max_len=_b.len;
 
        for (i=0; i<min_len; i++)
            _b.buffer[i]=_b.buffer[i]^_a.buffer[i];
       
        temp=_b;
        }
   
    i=temp.len-1;
        while(i>0)
        {
            if(temp.buffer[i]==0)
            {
                temp.len--;
            }
            if(temp.buffer[i]==1)
            {
                i=0;
            }
            i--;
        }
 
    return temp;
}
 
 
 
    whirlpool whirlpool::gf8mul(whirlpool a, whirlpool b)
    {
    int i=0;
    whirlpool _a;
    whirlpool _b;
    _a=a;
    _b=b;
    whirlpool c(a.len);
    for (i=0; i<c.len; i++)
    c.buffer[i]=0;
   
    const whirlpool pol2(9);
    pol2.buffer[0]=1, pol2.buffer[1]=0, pol2.buffer[2]=1, pol2.buffer[3]=1, pol2.buffer[4]=1, pol2.buffer[5]=0, pol2.buffer[6]=0, pol2.buffer[7]=0, pol2.buffer[8]=1;
   
    while (isnull(_b) == false)
    {
        if (_b.buffer[0]& 1)
        {
            c = c^_a;
        }
       
        _b = _b >> 1;
        _a = _a << 1;
 
        if (_a.len > 8)
        {
            _a = _a^pol2;//0x11d=100011101
        }
    }
 
    return c;
    }
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
//whirlpool.h
#pragma once
#include <iostream>
#include <fstream>
#include <iostream>
 
using namespace std;
 
class whirlpool
{
public:
 
    int *buffer;
    int len;
   
    whirlpool()
    {
        len=1;
        buffer = new int[len]; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!здесь ошибка std::bad_alloc
    }
 
    whirlpool(int length)
    {
        len = length;
        buffer = new int[len];
    }
   
bool isnull(whirlpool);
whirlpool operator=(whirlpool);
whirlpool operator<< (int);
whirlpool operator>> (int);
friend whirlpool operator^(whirlpool,whirlpool);
whirlpool gf8mul(whirlpool, whirlpool);
~whirlpool()
{
}
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2013, 19:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему new вызывает std::bad_alloc? (C++):

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

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

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

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

std::bad_alloc - C++
Здравствуйте. Пишу программу на Code::Blocks. Когда компилирую и запускаю в среде, то программа выполняется нормально. Когда запускаю...

Std::bad_alloc - C++
Возникает утечка. Пробовал очищать память в самых разный местах, но решить проблему не получается. for (int k = 0; k &lt; 22050; k++) { ...

3
Убежденный
Ушел с форума
Эксперт С++
15708 / 7218 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
28.10.2013, 00:40 #2
Код насквозь "дырявый". Тут нужны серьезные меры.
Начнем с того, что падает/зависает на простейших тестах.
Например:
C++
1
2
3
whirlpool a(1);
whirlpool b(100);
a = b;
Про утечки памяти и концептуально неверные реализации некоторых методов,
например, тот же оператор присваивания, пока не будем, нужно исправлять остальное.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7496 / 4611 / 694
Регистрация: 29.11.2010
Сообщений: 12,621
28.10.2013, 01:21 #3
Цитата Сообщение от Charley Посмотреть сообщение
//main.c
к слову, у cpp расширение .c++ или .cpp
Цитата Сообщение от Charley Посмотреть сообщение
using namespace std;
такое в хедерах не ставят, вполне неочевидно будет подключить заголовочный файл к проекту и узнать, что все функции оказались в стандартном пространстве имен.

Добавлено через 1 минуту
Вынесите реализацию в .cpp полностью

Добавлено через 37 секунд
Почему деструктор пустой также неясно, у вас же работа с динамической памятью идет.
0
Charley
5 / 5 / 0
Регистрация: 11.06.2012
Сообщений: 173
01.11.2013, 20:32  [ТС] #4
Здравствуйте, снова. Не могу отловить ошибку, кому не лень помогите. Для уточнения задавайте вопросы.
Whirlpool.rar
0
01.11.2013, 20:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2013, 20:32
Привет! Вот еще темы с ответами:

Ошибка std::bad_alloc - C++
Здравствуйте! Уже который день борюсь с этой ошибкой, но не могу понять, в чем проблема. После возникновения ошибки ругается на...

Ошибка std::bad_alloc - C++
Помогите. Если запускать программу с number = 6, то всё работает, а вот если запустить программу, поменяв 6 на любое другое число, то...

std:bad_alloc Проблемы с памятью - C++
Здравствуйте, проблема такая. Написал программу итерационного метода. Далее эту программу, поместил в функцию. И вызываю очень часто...

Std::bad_alloc магическое число - C++
Читаю байты из файла вылетает ошибка:Unhandled exception at 0x75A6C41F in Fourie With File.exe: Microsoft C++ exception:...


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

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

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