Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать размер буфера/массива? 
V
    Опции темы
vitlic
Дата 21.4.2007, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.2.2007
Где: где home(){return где="тут"}

Репутация: 1
Всего: 1



Пишу класс BitSet.

Один из конструкторов выглядит так:

Код


YY_BitSet::YY_BitSet(unsigned int size, const char * dataP):_size(size)
{
    if(!dataP)
    {...}
        else
        {...}

}


Вопрос такой можно ли узнать размер dataP? // strlen не подходит, так как в BitSet могут быть любые значения, даже 0.

Как это работает в компиляторе, ведь там это должно как-то отслеживаться, может через таблицы или структуры какие-нибудь. Если да, то можно ли проверять значения через них?






PM WWW   Вверх
JackYF
Дата 21.4.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



vitlic, уже была подобная тема. Воспользуйся поиском.
А если кратко, то есть нестандартные непереносимые функции....

Зачем тебе? Тебе вон пользователь size передает.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
vitlic
Дата 21.4.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.2.2007
Где: где home(){return где="тут"}

Репутация: 1
Всего: 1



Нашел, но не совсем то. Даже совсем не то.
А если юзверь передал размер не соответствующий размеру буфера?

Максимум, что я могу сделать это:

Код

YY_BitSet::YY_BitSet(unsigned int size, const char * dataP):_size(size)
{
    if(dataP && _size)
    {
        _dataP=new char[_size];
        memcpy(_dataP, dataP,_size);
    }
    else
    {
        _size=1;
        _dataP=new char(0);
    }
}
  

К примеру size ошибочен, то это может привести к проблемам в memcpy.
Но если выход нестандартные, непереносимые функции, то уж лучше так.

пасиб.


PM WWW   Вверх
vinter
Дата 21.4.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(vitlic @  21.4.2007,  12:21 Найти цитируемый пост)
А если юзверь передал размер не соответствующий размеру буфера?

ну так исключи эту ситуацию! зачем извращаться когда, моно ситуацию исключить?


--------------------
Мой блог
PM MAIL WWW   Вверх
vitlic
Дата 21.4.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.2.2007
Где: где home(){return где="тут"}

Репутация: 1
Всего: 1



Цитата(vinter @ 21.4.2007,  12:35)
Цитата(vitlic @  21.4.2007,  12:21 Найти цитируемый пост)
А если юзверь передал размер не соответствующий размеру буфера?

ну так исключи эту ситуацию! зачем извращаться когда, моно ситуацию исключить?

Что значит исключить? Типа внимания не обращать и будь что будет?
PM WWW   Вверх
JackYF
Дата 21.4.2007, 12:47 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(vitlic @  21.4.2007,  12:21 Найти цитируемый пост)
К примеру size ошибочен, то это может привести к проблемам в memcpy.

А если в stl-евские алгоритмы передать неправильный размер? А если юзер будет создавать массив неправильного размера?
Неужели это все надо отлавливать? Зачем тогда вообще размер передавать smile Да и кроме того, мало ли как юзер мог выделить ту память...

В общем, жди правильного поведения от юзера(программиста), чем извращаться. Полностью согласен с vinterом.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
vitlic
Дата 21.4.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.2.2007
Где: где home(){return где="тут"}

Репутация: 1
Всего: 1



Значит оставлю вот так:

Код

YY_BitSet::YY_BitSet(unsigned int size, const char * dataP):_size(size!=0 ? size : 1),
                                                  _dataP(new char[_size])
{
    if(dataP) memcpy(_dataP, dataP,_size);
    else *_dataP=0;        
}


Пусть юзеры наслаждаются своими ошибками) 

Снова всем спасибо  smile 
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0814 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.