我有一個指向我想要放入字符串的某些數據的指針。我認爲使用std::copy
應該是最安全的方法。將指針包裝成迭代器以便複製到STL容器
然而,在Visual Studio 2010中,我得到一個警告
警告C4996:「的std :: _ Copy_impl」:與可能不安全的參數函數調用 - 此調用依賴於調用方檢查通過值是正確的。要禁用此警告,請使用-D_SCL_SECURE_NO_WARNINGS。
當然,警告是正確的。在MSDN checked_array_iterator上描述的一些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