Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как узнать размер буфера/массива?


Автор: vitlic 21.4.2007, 11:50
Пишу класс BitSet.

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

Код


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

}


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

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






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

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

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

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

Код

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.
Но если выход нестандартные, непереносимые функции, то уж лучше так.

пасиб.


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

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

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

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

Что значит исключить? Типа внимания не обращать и будь что будет?

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

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

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

Автор: vitlic 21.4.2007, 13:00
Значит оставлю вот так:

Код

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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)