Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
#1

Выделение памяти в куче для строки для реализации длинной арифметики - C++

16.07.2014, 22:56. Просмотров 361. Ответов 9
Метки нет (Все метки)

Доброго времени суток, пишу класс string, на основе которого потом хочу реализовать класс для длинной арифметики. Поэтому мне понадобился такой конструктор:
C++
1
2
3
4
5
6
7
8
9
//  constructor by integer
string::string( const int number, const int base ) {
    char * buffer = (char *)realloc(NULL, sizeof(char)*sizeof(int)+5);
    _itoa(number, buffer, base );
    length = strlen(buffer);
    takeMemory( NULL, length );
    memcpy(data,buffer,length);
    free( buffer );
}
В чем, собственно проблема.
Если в строке "char * buffer = (char *)realloc(NULL, sizeof(char)*sizeof(int)+5);" вместо 5 ставить что то меньшее, то во время выполнения free( buffer ) получаю сообщение о возможном повреждении кучи. Помогите понять причину происходящего, почему именно 5?


Программа-тестер:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using std::endl;
using std::cout;
using std::cin;
 
#include "string.h"
 
int main ( void ) {
    int n = 255;
    string binary( n, 2 );
 
    std::cout << binary;
    
    cin.get(); cin.get();
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2014, 22:56     Выделение памяти в куче для строки для реализации длинной арифметики
Посмотрите здесь:

Ошибка в реализации длинной арифметики - C++
Здравствуйте. Я скопировал с e-maxx'а и объединил всё в одну программу: #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;cstdio&gt; ...

Ищу примеры реализации длинной арифметики - C++
Здравствуйте! Скиньте пожалуйста примеры решения задач на тему &quot;Длинная арифметика&quot;! Желательно с подробным пояснением! Язык C++. Очень...

Потоки и выделение памяти в куче - C++
Подскажите, кто знает, какие есть тонкости при выделении памяти в куче (new) в потоках отличных от главного. У меня возникают исключения...

Указатели (Выделение памяти в куче) - C++
Чтобы создать в динамически распределяемой памяти переменную типа unsigned short необходимо написать следующее: unsigned short...

Выделение памяти для строки - C++
Почему размер строки первой 4 байта а второй 50 байт?Первая должна сколько же. #include &lt;stdio.h&gt; #include &lt;Windows.h&gt; #include...

Динамическое выделение памяти. Ошибки в куче - C++
Функция чтения данных из ячейки экселя wchar_t *DataInCell( Excel::_WorksheetPtr Sheet, int Row, int Col ) Excel::RangePtr Cell; ...

Выделение памяти для строки символов - C++
Нужно выделить память под массив указателей на строки, ввести текст построчно динамически выделяя память для каждой строки и записывая...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2014, 23:06     Выделение памяти в куче для строки для реализации длинной арифметики #2
Цитата Сообщение от satisfactor Посмотреть сообщение
класс string, на основе которого потом хочу реализовать класс для длинной арифметики.
Любопытно. Зачем такое совмещение?
По теме:
1. Если пишите на C++ забудьте про realloc. Это сишная функция.
2. Раз уж используете, то ознакомьтесь с документацией.
3. sizeof(char)*sizeof(int). Чего вообще Вы этим хотели добиться?
nmcf
5122 / 4442 / 1481
Регистрация: 14.04.2014
Сообщений: 17,631
16.07.2014, 23:12     Выделение памяти в куче для строки для реализации длинной арифметики #3
Может мало выделяешь? 1*4 + 5 = 9. itoa не знает допустимый размер строки и может выйти за пределы.
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
16.07.2014, 23:18  [ТС]     Выделение памяти в куче для строки для реализации длинной арифметики #4
Добавлено через 2 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
Может мало выделяешь? 1*4 + 5 = 9. itoa не знает допустимый размер строки и может выйти за пределы.
На моей системе sizeof(int) = 8
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2014, 23:19     Выделение памяти в куче для строки для реализации длинной арифметики #5
Цитата Сообщение от nmcf Посмотреть сообщение
Может мало выделяешь?
А других вариантов и быть не может. http://www.cyberforum.ru/cgi-bin/latex.cgi?{255}_{10} = {11111111}_{2}
Т.е. 8 символов + 1 терминирующий. Плохо, что ТС вообще не понимает что делает.

Добавлено через 1 минуту
Цитата Сообщение от satisfactor Посмотреть сообщение
Ну это, как мне кажется, даст количество байт в int.
Даст. Но как это связано с тем, что Вы хотите получить? Или вы думаете, что в строку из sizeof(int) байт поместится любое число из диапазона int (в любой системе счисления)?
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
16.07.2014, 23:20  [ТС]     Выделение памяти в куче для строки для реализации длинной арифметики #6
Tulosba,
Правильно, 8 символов, что есть sizeof(int) + 1 на нуль-символ. Изначально так и было. Но Работает только с sizeof(int) + 5. Так где я что не понял?
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2014, 23:23     Выделение памяти в куче для строки для реализации длинной арифметики #7
Цитата Сообщение от satisfactor Посмотреть сообщение
Так где я что не понял?
C++
1
2
int i = 1234567890; // sizeof(int) = 8 (поверю Вам на слово)
const char c[] = "1234567890"; // sizeof(c) = 11 (кол-во символов+терминирующий нуль)
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
16.07.2014, 23:24  [ТС]     Выделение памяти в куче для строки для реализации длинной арифметики #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Даст. Но как это связано с тем, что Вы хотите получить? Или вы думаете, что в строку из sizeof(int) байт поместится любое число из диапазона int (в любой системе счисления)?
в любой системе, конечно, нет. Но в данном случае функции передается base = 2...
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2014, 23:26     Выделение памяти в куче для строки для реализации длинной арифметики #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от satisfactor Посмотреть сообщение
Но в данном случае функции передается base = 2...
И что из этого следует? На каждый бит потребуется байт для отображения в виде строки.
Если Ваш sizeof(int) = 8, то это 8 байт = 8*8 = 64 бита ... дальше понятно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2014, 23:31     Выделение памяти в куче для строки для реализации длинной арифметики
Еще ссылки по теме:

Динамическое выделение памяти для строки - C++
Подскажите, пожалуйста , почему в данной программе появляются ошибки в строке return Vector(v1.x + v2.x, v1.y + v2.y, v1.cp +...

Выделение и удаление памяти, выделенной для динамической строки - C++
Данная функция производит ввод и собственно контроль ввода (размер массива от 1 до 20, иначе должна выдавать ошибку; при вводе букв также...

Класс длинной арифметики - C++
Дайте класс длинной арифметики - хотелось бы разобраться в этой штуке, а то какие исходники не найду - то не рабочие, то еще что-то( ...

Объясните код длинной арифметики - C++
Не могу понять синтаксиса этого кода void add(vlong *op1, vlong *op2, vlong *res) { vlong *mxop, *mnop; int i, flag=0, st; mxop =...

Реализация длинной целочисленной арифметики - C++
Добрый день! Возникла такая проблема: была поставлена задача реализовать детерминированный тест Миллера на простоту. С этим более-менее...


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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6541 / 5007 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
16.07.2014, 23:31     Выделение памяти в куче для строки для реализации длинной арифметики #10
Цитата Сообщение от satisfactor Посмотреть сообщение
Но в данном случае функции передается base = 2...
ну и сколько нужно ячеек памяти чтобы записать char (1 байт) как минимум 9, 8 под биты и 1 под завершающий 0
если ты работаешь с двоичным представлением то тебе нужен размер в битах а sizeof дает размер в байтах
умножай результат на 8
Yandex
Объявления
16.07.2014, 23:31     Выделение памяти в куче для строки для реализации длинной арифметики
Ответ Создать тему
Опции темы

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