У меня есть указатель на некоторые данные, которые я хочу поместить в строку. Я думал, что использование std::copy
должно быть самым безопасным подходом.Указатели для вставки в итератор для копирования в контейнер STL
Однако в Visual Studio 2010 я получаю предупреждение
предупреждение C4996: «станд :: _ Copy_impl»: Вызов функции с параметрами, которые могут быть небезопасны - это вызов зависит от вызывающего абонента, чтобы проверить, что прошло значения верны. Чтобы отключить это предупреждение, используйте -D_SCL_SECURE_NO_WARNINGS.
И, конечно, предупреждение правильное. Есть некоторые checked_array_iterator
объекты, описанные на MSDN checked_array_iterator, которые можно использовать для обертывания указателя, подобного этому, и сделать его совместимым с итераторами STL.
Проблема в том, что этот checked_array_iterator
может использоваться только как цель, но не как источник.
Так что, когда я пытаюсь использовать его, как это, происходит сбой приложения или не компилируется:
char buffer[10] = "Test";
std::string s;
// These are parameters from an external call and only shown here to illustrate the usage.
char *pTargetAdress = &s;
const char *oBegin = buffer;
const char *oEnd = oBegin+sizeof(buffer);
std::string *p = reinterpret_cast<std::string *>(pTargetAdress);
std::copy(oBegin, oEnd, p->begin()); // crash
stdext::checked_array_iterator<const char *>beg(oBegin, oEnd-oBegin);
stdext::checked_array_iterator<const char *>end(oEnd, 0);
std::copy(beg, end, p->begin()); // crash
stdext::checked_array_iterator<const char *>v(oBegin, oEnd-oBegin);
std::copy(v.begin(), v.end(), p->begin()); // doesn't compile
Если есть портативный стандартный способ, я бы скорее хотел бы использовать это вместо reyling на MS.
Конечно есть 'строка :: assign', который может взять буфер как параметр с размером буфера или без него. –
@BoPersson, да, вы были правы. Это то, что я сейчас использую. – Devolus