C++ 为什么';这不管用吗?
所以我有下面的代码,我想做的一个简化版本。我有一个类,其中有一个成员变量,我想根据情况将其设置为各种不同的数据类型(我刚刚为这个测试创建了一个随机结构)。不过,我一直在memcpy函数上遇到seg故障,我不知道为什么C++ 为什么';这不管用吗?,c++,memcpy,C++,Memcpy,所以我有下面的代码,我想做的一个简化版本。我有一个类,其中有一个成员变量,我想根据情况将其设置为各种不同的数据类型(我刚刚为这个测试创建了一个随机结构)。不过,我一直在memcpy函数上遇到seg故障,我不知道为什么 #include <cstdlib> #include <iostream> #include <assert.h> #include <string> #include <string.h> #include
#include <cstdlib>
#include <iostream>
#include <assert.h>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;
struct product
{
int price;
string name;
};
class object
{
public:
void setData(void *ptr);
void* data;
};
void object::setData(void *ptr)
{
assert(ptr);
memcpy(data, ptr, sizeof(ptr));
}
int main()
{
product* bag;
product ba;
bag = &ba;
bag->price = 5;
bag->name = "bag";
object test;
test.setData(bag);
cout<<test.data->name<<endl;
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
结构产品
{
国际价格;
字符串名;
};
类对象
{
公众:
void setData(void*ptr);
作废*数据;
};
void对象::setData(void*ptr)
{
断言(ptr);
memcpy(数据、ptr、尺寸(ptr));
}
int main()
{
产品*袋;
产品ba;
包=&ba;
袋子->价格=5;
袋子->名称=“袋子”;
目标测试;
试验数据(袋);
cout您的代码有多个问题,但SIGSEGV的直接原因如下:
memcpy(data,ptr,sizeof(ptr));
尝试将若干字节复制到未分配的指针数据中
一个旁注,看起来你试图用完全不匹配的方法来实现C++中的多态性。
你的代码有多个问题,但是SIGSEGV的直接原因如下:
memcpy(data,ptr,sizeof(ptr));
尝试将若干字节复制到未分配的指针数据中
在一个旁注中,看起来你试图用完全不匹配的方法来实现C++中的多态性。
我也认为这里可能是问题< /P>
cout<<test.data->name<<endl;
cout我想这可能是个问题
cout<<test.data->name<<endl;
cout其他人提到,由于使用了sizeof(void*),所以memcpy
不正确
作为要复制的字节数。但是将sizeof
更改为适当的值只会让您遇到下一个使用memcpy
的障碍。您可能会在执行这一行时遇到它:
cout<<test.data->name<<endl
cout其他人提到,由于使用了sizeof(void*),所以memcpy
不正确
作为要复制的字节数。但是将sizeof
更改为适当的值只会让您遇到下一个使用memcpy
的障碍。您可能会在执行这一行时遇到它:
cout<<test.data->name<<endl
coutsizeof(ptr)
???你期望这是什么?还有-你不能仅仅是memcpy
一个字符串对象。即使你得到了sizeof
的正确值,你也不能在非POD类型上使用memcpy
,比如你的product
类。sizeof(ptr)
???你期望这是什么?还有-你不能仅仅是memcpy
一个字符串对象。即使你的sizeof
是正确的,你也不能在非POD类型上使用memcpy
,比如你的产品
类。尽管很有趣,std::string
几乎就是POD。唯一阻止它被使用的东西是PODPOD是不同的访问控制,但这不太可能导致memcpy
出现任何问题。很抱歉,由于引用了过时的POD定义,必须进行否决表决。具有非平凡的析构函数还可以防止std::string
成为“几乎是POD”。一点也不,再也不会了。有趣的是,std::string
几乎是POD。唯一阻止它成为POD的是不同的访问控制,但这不太可能导致memcpy
出现任何问题。很抱歉,由于引用了过时的POD定义,不得不投反对票。拥有一个非平凡的析构函数也可以防止std::string
从“几乎是豆荚”。一点也不,不再是了。