tjw*_*992 2 c++ memcpy undefined-behavior boost-any
我试图boost::any通过网络 API 传递包含数据成员的对象,以在两个应用程序之间交换数据。我知道 APImemcpy在内部使用来复制数据,但我不确定我想要做的是否是调用未定义的行为。
我写了一个简单的例子来演示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);
}
Run Code Online (Sandbox Code Playgroud)
此代码似乎可以工作,并打印以下输出:
Size: 8
SRC: This is some data.
DST: This is some data.
Run Code Online (Sandbox Code Playgroud)
但是根据存储在对象中的类型,Data大小不会改变吗?无论我使用哪种类型,它总是打印尺寸为8。
这段代码是否调用了未定义的行为?如果是,我该如何修复它以便我可以正确地memcpy包含数据成员的对象boost::any?
any包含一个指针,并且有一个析构函数,总体来说是您不想要的memcpy。它在这里起作用是因为 和src都dst位于相同的内存空间中,并且因为您\xe2\x80\x99free正在调用该对象而不运行析构函数。
memcpy对于所持有的指向对象any(由 所返回的对象)来说可能没问题any_cast。它本身或者包含它的物体肯定是不行的。memcpyany
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |