c++ - 使用 std::memcpy 复制包含 boost::any 数据成员的对象
问题描述
我正在尝试boost::any
通过网络 API 传递一个包含数据成员的对象,以在两个应用程序之间交换数据。我知道 API 在memcpy
内部使用来复制数据,但我不确定我想要做的是否是调用未定义的行为。
我写了一个简单的例子来演示memcpy
以这种方式使用:
#include <boost/any.hpp>
#include <cstring>
#include <string>
#include <iostream>
class Data
{
public:
template <typename T>
Data(T value)
: m_value(value)
{}
template <typename T>
T Read() const
{
return boost::any_cast<T>(m_value);
}
private:
boost::any m_value;
};
int main()
{
Data src(std::string("This is some data."));
std::cout << "Size: " << sizeof(src) << std::endl;
std::cout << "SRC: " << src.Read<std::string>() << std::endl;
void* dst = malloc(sizeof(src));
std::memcpy(dst, &src, sizeof(src));
const auto data = static_cast<Data*>(dst);
std::cout << "DST: " << data->Read<std::string>() << std::endl;
std::free(dst);
}
此代码似乎可以工作,并打印以下输出:
Size: 8
SRC: This is some data.
DST: This is some data.
但是根据Data
对象中存储的类型,大小不会改变吗?无论我使用什么类型,它总是打印出尺寸为8
.
这段代码是否调用了未定义的行为?如果是,我该如何修复它,以便我可以正确地memcpy
创建一个包含boost::any
数据成员的对象?
解决方案
any
包含一个指针,并具有一个析构函数,并且总体上是您不想要的memcpy
。它在这里工作是因为两者src
和dst
都在相同的内存空间中,并且因为您在free
不运行析构函数的情况下调用对象。
对于由(返回的对象)memcpy
持有的指向对象可能没问题。它本身或包含它的对象绝对不行。any
any_cast
memcpy
any
推荐阅读
- javascript - Google 应用程序脚本:在已部署的网络应用程序中查看 PDF
- javascript - 从输入中获取数据以发送到whatsapp
- swift - Swift:检查成功的 HTTP 状态码
- java - 仅从 editText 检测和更改“hello”文本 font-family
- php - 如何在 PHP 中包含用字符串标记的文件?
- java - 不完整的类型:
无法转换为组件 - flutter - Flutter:未处理的异常:“String”类型不是“bool”类型的子类型
- typescript - “字符串”类型的索引签名只允许读取
- javascript - 使用 PHP 和 JavaScript 以模态显示表格数据
- python - 没有使用 python 抓取从 HTML 获取数据