Добрый день!
Есть необходимость обернуть указатель на BYTE в STL контейнер (именно STL, boost не рассматривается).
Как я понял, подходят два варианта std::vector<BYTE> и std::auto_ptr<BYTE>
Есть функции, в которые нужно собственно передать указатель на BYTE,
для вектора будет вызываться: function(...,&vect[0],...)
для auto_ptr : function(...,ptr.get(),...)
Посоветуйте, какой контейнер подойдет больше, плюсы/минусы обоих подходов?
PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?
Здравствуйте, fordil, Вы писали:
F>Добрый день! F>Есть необходимость обернуть указатель на BYTE в STL контейнер (именно STL, boost не рассматривается). F>Как я понял, подходят два варианта std::vector<BYTE> и std::auto_ptr<BYTE>
F>Есть функции, в которые нужно собственно передать указатель на BYTE, F>для вектора будет вызываться: function(...,&vect[0],...) F>для auto_ptr : function(...,ptr.get(),...)
F>Посоветуйте, какой контейнер подойдет больше, плюсы/минусы обоих подходов?
F>PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?
auto_ptr это не контейнер, а умный указатель, который при присваивании одного auto_ptr другому (например, при передачи в параметры функции)
отнимет указатель на ваш BYTE у первого.
вы рассматриваете возможность хранить в векторе 1 BYTE ???
Мне твоя Москва нравится, и обратно в Россию я не вернусь! (с) мыльная о.
Здравствуйте, fordil, Вы писали:
F>Добрый день! F>Есть необходимость обернуть указатель на BYTE в STL контейнер (именно STL, boost не рассматривается). F>Как я понял, подходят два варианта std::vector<BYTE> и std::auto_ptr<BYTE>
дело в том, что std::vector<BYTE> — это аналог массива, тоесть аналог 'new BYTE[size]' / 'delete []'
тогда как std::auto_ptr<BYTE> это умный указатель(а не контейнер), аналог 'new BYTE' / 'delete'
F>Посоветуйте, какой контейнер подойдет больше, плюсы/минусы обоих подходов?
так что если нужно хранение именно массива, то std::vector<BYTE>
F>PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?
нет, хранить std::auto_ptr<> в контейнерах нельзя.
Здравствуйте, fordil, Вы писали:
F>Добрый день! F>Есть необходимость обернуть указатель на BYTE в STL контейнер (именно STL, boost не рассматривается). F>Как я понял, подходят два варианта std::vector<BYTE> и std::auto_ptr<BYTE>
F>Есть функции, в которые нужно собственно передать указатель на BYTE, F>для вектора будет вызываться: function(...,&vect[0],...) F>для auto_ptr : function(...,ptr.get(),...)
F>Посоветуйте, какой контейнер подойдет больше, плюсы/минусы обоих подходов?
Если речь идет о единичном элементе типа BYTE, то гораздо естественнее использовать std::auto_ptr. У вектора банально больше накладные расходы, да и использование вектора сразу наводит на мысль о массиве.
Если мы говорим о массивах, то однозначно std::vector. std::auto_ptr просто не предназначен для хранения массивов — хотя бы из-за delete без скобочек в деструкторе, что есть UB.
F>PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?
Нет. std::auto_ptr не удовлетворяет требованиям, предъявляемым к элементам стандартных контейнеров из-за своей семантики копирования и присваивания (элементы стандартных контейнеров должны быть copy-constructible и assignable)
Здравствуйте, fordil, Вы писали:
>>вы рассматриваете возможность хранить в векторе 1 BYTE ???
F>Нет) У меня есть последовательность символов, для хранения одного символа используется апишный тип BYTE.
тогда есс-но std::vector<BYTE>, только он в хипе память выделит
Мне твоя Москва нравится, и обратно в Россию я не вернусь! (с) мыльная о.
Здравствуйте, fordil, Вы писали:
I>>auto_ptr нельзя использовать для хранения указателя полученного вызовом new для массивов.
F>Объясните, пожалуйста, почему нельзя. Ну или где об этом можно прочитать?
для массивов нужно new[] и delete[]
auto_ptr же вызывает просто delete
Мне твоя Москва нравится, и обратно в Россию я не вернусь! (с) мыльная о.
Здравствуйте, fordil, Вы писали:
I>>auto_ptr нельзя использовать для хранения указателя полученного вызовом new для массивов.
F>.... Ну или где об этом можно прочитать?
Здравствуйте, fordil, Вы писали:
F>Есть необходимость обернуть указатель на BYTE в STL контейнер (именно STL, boost не рассматривается). F>Как я понял, подходят два варианта std::vector<BYTE> и std::auto_ptr<BYTE>
F>Есть функции, в которые нужно собственно передать указатель на BYTE, F>для вектора будет вызываться: function(...,&vect[0],...) F>для auto_ptr : function(...,ptr.get(),...)
А почему std::string не рассматривается?
На худой конец std::basic_string<BYTE>. Можно как массив BYTE'ов использовать, обращаться по индексу, итерировать, передавать как массив ( .data() ), правда, только как in параметр, как out data() нельзя использовать.
Здравствуйте, abrec, Вы писали:
A>Здравствуйте, fordil, Вы писали:
F>>PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?
A>Класть std::auto_ptr в контейнеры — это неправильно.
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Здравствуйте, abrec, Вы писали:
A>>Здравствуйте, fordil, Вы писали:
F>>>PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?
A>>Класть std::auto_ptr в контейнеры — это неправильно.
АШ>Это запрещено стандартом.
?!!
Это никто не запрещает. Просто смысла нет, исходя из семантики. В отличие от того же boost::shared_ptr.
Здравствуйте, Mr.Delphist, Вы писали:
MD>Это никто не запрещает
Стандарт нарушается (точнее пророчится UB), если класть auto_ptr в стандартные контейнеры, т.к. auto_ptr не CopyConstructable
20 General utilities library
20.4.5 Class template auto_ptr
3 The auto_ptr provides a semantics of strict ownership. An auto_ptr owns the object it holds a
pointer to. Copying an auto_ptr copies the pointer and transfers ownership to the destination. If more
than one auto_ptr owns the same object at the same time the behavior of the program is undefined.
[Note: The uses of auto_ptr include providing temporary exception-safety for dynamically allocated
memory, passing ownership of dynamically allocated memory to a function, and returning dynamically
allocated memory from a function. auto_ptr does not meet the CopyConstructible and
Assignable requirements for Standard Library container elements and thus instantiating a Standard
Library container with an auto_ptr results in undefined behavior. —end note]