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

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

Восстановить пароль Регистрация
 
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
16.07.2014, 22:56     Выделение памяти в куче для строки для реализации длинной арифметики #1
Доброго времени суток, пишу класс 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++
Потоки и выделение памяти в куче C++
Выделение памяти для строки символов C++
C++ Указатели (Выделение памяти в куче)
Ошибка в реализации длинной арифметики C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.07.2014, 23:06     Выделение памяти в куче для строки для реализации длинной арифметики #2
Цитата Сообщение от satisfactor Посмотреть сообщение
класс string, на основе которого потом хочу реализовать класс для длинной арифметики.
Любопытно. Зачем такое совмещение?
По теме:
1. Если пишите на C++ забудьте про realloc. Это сишная функция.
2. Раз уж используете, то ознакомьтесь с документацией.
3. sizeof(char)*sizeof(int). Чего вообще Вы этим хотели добиться?
nmcf
4308 / 3729 / 1257
Регистрация: 14.04.2014
Сообщений: 14,613
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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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++
C++ Класс длинной арифметики
Динамическое выделение памяти. Ошибки в куче C++

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

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

Текущее время: 11:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru