【发布时间】:2021-05-16 02:17:03
【问题描述】:
我正在尝试将 unique_ptr 缓冲区 和 uint32_t bufferSize 描述的内存区域写入 std::vector 值。当我为此使用 std::memcpy 时,我收到以下警告:
‘void* memcpy(void*, const void*, size_t)’ 写入类型为 ‘class std::vector
’ 的对象,没有简单的复制赋值;使用复制分配或复制初始化 [-Wclass-memaccess]
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, port, server, 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, buffer.get(), bufferSize);
return 0;
}
解决问题的正确方法是什么?
问候 蒂尔曼
【问题讨论】:
-
value.assign(buffer.get(), buffer.get() + bufferSize);? -
离题但是...
buffer应该使用std::unique_ptr<uint8_t[]>(new uint8_t[bufferSize])而不是std::unique_ptr<uint8_t>(new uint8_t[bufferSize])进行初始化——注意额外的[]。 -
谢谢,我想这就是我要找的@Jarod42。
标签: c++ stdvector unique-ptr memcpy