如何解决Memcpy unique_ptr 到向量
我正在尝试将 unique_ptr 缓冲区 和 uint32_t bufferSize 描述的内存区域写入 std::vector 值。当我为此使用 std::memcpy 时,我收到以下警告:
‘void* memcpy(void*,const void*,size_t)’写入类型为‘class std::vector
int ReadByName (std::vector<unsigned char> &value,const char handleName[],std::ostream &out,const long &port,const AmsAddr &server)
{
uint32_t bytesRead;
out << __FUNCTION__ << "(): ";
if (this->handle == 0)
handle = getHandleByName(out,port,server,handleName);
if (bufferSize == 0)
bufferSize = getSymbolSize(out,handleName);
const auto buffer = std::unique_ptr<uint8_t>(new uint8_t[bufferSize]);
const long status = AdsSyncReadReqEx2( port,&server,ADSIGRP_SYM_VALBYHND,handle,bufferSize,buffer.get(),&bytesRead);
if (status) {
out << "ADS read failed with: " << std::dec << status << '\n';
return 2;
}
value.clear();
value.reserve(bufferSize);
std::memcpy(&value,bufferSize);
return 0;
}
解决问题的正确方法是什么?
问候 提尔曼
解决方法
解决问题的正确方法是什么?
这将是直接读入向量,而不是您稍后复制的单独数组。
如果使用 AdsSyncReadReqEx2() 的读取操作失败,值将已被清除。
不要清除 value
,而是使用另一个向量。如果操作成功,则将中间向量移动分配给 value
,这不需要复制元素。
更好的是:根本不要将 value
传递给函数,而是返回向量并使用比普通错误代码更现代的错误处理机制。例如,您可以使用例外或类似于建议的 std::expected
的内容。
两个错误,这是正确的代码
value.clear();
value.resize(bufferSize);
std::memcpy(value.data(),buffer.get(),bufferSize);
第一个错误,&value
没有为您提供向量的数据区域供您写入 value.data()
中。
第二个错误,reserve
不会改变向量的大小,因此您正在写入一个空向量。使用 resize
更改矢量的大小。
编辑
显然,eerorika 所说的是真的。您可以修改上述代码,将指向矢量数据的有效指针传递给 AdsSyncReadReqEx2
,并完全取消 buffer
。
value.resize(bufferSize);
const long status = AdsSyncReadReqEx2( port,&server,ADSIGRP_SYM_VALBYHND,handle,value.size(),value.data(),&bytesRead);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。