Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

new вызывает std::bad_alloc

445
27 октября 2013 года
Charley
176 / / 16.08.2011
Вопрос в пустоту, ну все же я попробую. Скомпилил данные исходники в visual studio 2008. Получил ошибку в конструкторе whirlpool():
функция gf8mul умножает многочлены над полем 2^8:
Код:
//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;
}
Код:
//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;
    }
Код:
//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()
{
}
};
412
27 октября 2013 года
grgdvo
323 / / 04.07.2007
Много кода! Для локализации обшибки советую временно убрать (закоментировать) все функции, не имеющие отношения к ошибке.
Как минимум вижу неверную реализацию оператора присваивания (operator =)
Почему не происходит выделение памяти? Длины буферов могут быть разные.

Еще посоветовла бы:
1. Для конструктора по умолчанию (когда длина неизвестина), сделать ее =0, а буфер =NULL. Везде сделать проверку использования buffer, когда он должен быть не NULL
2. Сделать отдельные внутренние функции создания и уничтожения буфера. В них можно будет ставить брейкопинт, а потом по стеку смотреть ошибочное состояние. Брейкпоинты и так, конечно, можно ставить, но делать это в одном месте проще.
260
28 октября 2013 года
Ramon
1.1K / / 16.08.2003
Здесь и "локализовывать" нечего, ибо не*ер передавать "по значению" со всеми вытекающими.
326
28 октября 2013 года
sadovoya
757 / / 19.11.2005
Цитата:
Вопрос в пустоту, ну все же я попробую


Странно, что еще отвечают :)

260
28 октября 2013 года
Ramon
1.1K / / 16.08.2003
Но что есть Пустота и какова ее пустотность?
327
28 октября 2013 года
UserNet2008
748 / / 03.04.2010
Цитата: Charley
Вопрос в пустоту, ну все же я попробую. Скомпилил данные исходники в visual studio 2008. Получил ошибку в конструкторе whirlpool():


Код для консоли о каком конструкторе идёт разговор. Ну так нельзя, тупо тыкать куда-попало код.

Цитата: Ramon
Но что есть Пустота и какова ее пустотность?


Сам сайт пустота-полная.

445
28 октября 2013 года
Charley
176 / / 16.08.2011
Цитата: Ramon
Здесь и "локализовывать" нечего, ибо не*ер передавать "по значению" со всеми вытекающими.


А как их передавать, если мне нужно оставить начальные значения параметров?

414
28 октября 2013 года
CassandraDied
763 / / 24.05.2012
А кто в деструкторе память высвобождать будет, а?
Цитата:
А как их передавать, если мне нужно оставить начальные значения параметров?


Click.

445
03 ноября 2013 года
Charley
176 / / 16.08.2011
Снова, здравствуйте по всем вашим пожеланиям я изменил оператор =
Код:
whirlpool whirlpool::operator=(whirlpool a)
{
    int i=0;
    delete[] buffer;
    len=a.len;
    buffer = new int[len];
    for (i=0; i<len; i++)
        buffer[i]=a.buffer[i];

    return *this;
}
Теперь ошибка:
HEAP CORRUPTION DETECTED: after Normal block (#17771) at 0x003389F0. CRT detected that the apllication wrote to memory after end of heap buffer.
445
03 ноября 2013 года
Charley
176 / / 16.08.2011
Вот моя прога, кому не лень помогите.
Прикрепленные файлы:
7 Кб
Загрузок: 499
446
03 ноября 2013 года
Meander
487 / / 04.09.2011
Ошибка в преобразователе BinToDec(whirlpool bin), я заменил его таким:
Код:
int whirlpool::BinToDec(whirlpool bin)
    {
    int i=0, dec=0;

        for (i=0; i<bin.len; i++)
        {
      dec <<= 1;
      if(bin.buffer[i] == 1) dec |= 1;
        }

    len=i;

    if(bin.len != sizeof(dec)*8)
    {
      dec <<= sizeof(dec)*8 - bin.len;
      dec >>= sizeof(dec)*8 - bin.len;
    }

    return dec;
    }
Смотри тут (сообщение 3).
445
03 ноября 2013 года
Charley
176 / / 16.08.2011
Цитата: Meander
Ошибка в преобразователе BinToDec(whirlpool bin)

теперь выскакивает исключение в operator=

446
03 ноября 2013 года
Meander
487 / / 04.09.2011
Цитата: Charley
Цитата: Meander
Ошибка в преобразователе BinToDec(whirlpool bin)

теперь выскакивает исключение в operator=


А там надо написать

 
Код:
if(buffer) delete[] buffer;
445
03 ноября 2013 года
Charley
176 / / 16.08.2011
Цитата: Meander

 
Код:
if(buffer) delete[] buffer;


не, не работает

446
03 ноября 2013 года
Meander
487 / / 04.09.2011
Цитата: Charley
Цитата: Meander

 
Код:
if(buffer) delete[] buffer;


не, не работает


Попробуй пересобрать проект. У меня все работает. Какие сообщения выводит?
Еще в main я написал так:

 
Код:
char tex[] = "habrahabr";
  char *text = tex;
260
03 ноября 2013 года
Ramon
1.1K / / 16.08.2003
Цитата: Charley
Вот моя прога, кому не лень помогите.



Простите мне мою бестактность, но эту помойку можно соглашаться разгребать только за деньги, да и то не факт.
Безобразнейшее управление ресурсами и использование языка.

PS: Мой Вам совет: используйте С. Использовать C++ еще ой как рано.

445
03 ноября 2013 года
Charley
176 / / 16.08.2011
Цитата: Ramon
Цитата: Charley
Вот моя прога, кому не лень помогите.



Простите мне мою бестактность, но эту помойку можно соглашаться разгребать только за деньги, да и то не факт.
Безобразнейшее управление ресурсами и использование языка.

PS: Мой Вам совет: используйте С. Использовать C++ еще ой как рано.


Я выложил с той целью, чтобы вы мне показали на типичные ошибки. C++ меня учили давно так что извиняйте, все забывается. Если что не понятно могу объяснить работу алгоритма. Да и вообще его разбирать не обязательно. Короче все разбирать от вас не требуется, нужно лишь поверхностно пробежаться по коду.

446
03 ноября 2013 года
Meander
487 / / 04.09.2011
Посмотри, это просмотренный мной, твой архив. Что не так?
Прикрепленные файлы:
252 Кб
Загрузок: 467
445
03 ноября 2013 года
Charley
176 / / 16.08.2011
Цитата: Meander
Посмотри, это просмотренный мной, твой архив. Что не так?

та же самая ошибка. ос: win 7, среда visual studio 2008

445
03 ноября 2013 года
Charley
176 / / 16.08.2011
ошибка
326
03 ноября 2013 года
sadovoya
757 / / 19.11.2005
Не все вы учли. Где явный конструктор копии? Вам о нем говорили.
Читаем раз, два, три. Всем разрушителям памяти :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог