C++ 为什么';这不管用吗?

C++ 为什么';这不管用吗?,c++,memcpy,C++,Memcpy,所以我有下面的代码,我想做的一个简化版本。我有一个类,其中有一个成员变量,我想根据情况将其设置为各种不同的数据类型(我刚刚为这个测试创建了一个随机结构)。不过,我一直在memcpy函数上遇到seg故障,我不知道为什么 #include <cstdlib> #include <iostream> #include <assert.h> #include <string> #include <string.h> #include

所以我有下面的代码,我想做的一个简化版本。我有一个类,其中有一个成员变量,我想根据情况将其设置为各种不同的数据类型(我刚刚为这个测试创建了一个随机结构)。不过,我一直在memcpy函数上遇到seg故障,我不知道为什么

 #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

cout
sizeof(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
从“几乎是豆荚”。一点也不,不再是了。