gpt4 book ai didi

c++ - 将指针包装到迭代器中以复制到 STL 容器中

转载 作者:行者123 更新时间:2023-11-30 03:48:15 24 4
gpt4 key购买 nike

我有一个指向我想放入字符串中的一些数据的指针。我认为使用 std::copy 应该是最安全的方法。

但是,在 Visual Studio 2010 中我收到警告

warning C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -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

如果有可移植的标准方法,我宁愿使用它而不是依靠 MS 扩展。

最佳答案

指针是非常好的(随机访问)迭代器。问题在于您将数据复制到坏内存中。 p->begin() 等于 s.begin() 等于 s.end() 指向无效内存。要解决此问题,您可以使用例如

std::string *p = reinterpret_cast<std::string *>(pTargetAdress);
p->resize(oEnd - oBegin); //resize to make room for the data
std::copy(oBegin, oEnd, p->begin()); // no more crash

或者替代地

#include <iterator>

std::string *p = reinterpret_cast<std::string *>(pTargetAdress);
std::copy(oBegin, oEnd, std::back_inserter(*p)); // copy by appending to the end

或者可能只是

std::string *p = reinterpret_cast<std::string *>(pTargetAdress);
*p = std::string(oBegin, oEnd); // copy by temporary

关于c++ - 将指针包装到迭代器中以复制到 STL 容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33281830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com