Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gcc8由于非平凡的可复制类型而引发编译错误_C++_Gcc8 - Fatal编程技术网

C++ gcc8由于非平凡的可复制类型而引发编译错误

C++ gcc8由于非平凡的可复制类型而引发编译错误,c++,gcc8,C++,Gcc8,//构造函数是在这里定义的 class mapInfo { public: mapInfo(); ~mapInfo(); public: int dataType_m; private: int *frequency; }; //这里定义了析构函数 mapInfo::mapInfo() : dataType_m(0), frequency(NULL) { } 使用gcc8编译时,出现以下编译错误。看起来像上面定义的析构函数给出

//构造函数是在这里定义的

class mapInfo
{
public:
    mapInfo();
    ~mapInfo();  
public:
    int dataType_m;

private:
    int *frequency;
};
//这里定义了析构函数

    mapInfo::mapInfo() :
    dataType_m(0),
    frequency(NULL)
{
}  
使用gcc8编译时,出现以下编译错误。看起来像上面定义的析构函数给出了gcc8的编译错误

如何解决这个问题


<>这是不恰当的C++。按照以下方式重写您的代码我在这里猜测频率的类型,但绝对不要使用免费的:


<>这是不恰当的C++。按照以下方式重写您的代码我在这里猜测频率的类型,但绝对不要使用免费的:

这是不明智的。如果一个对象是非平凡的,就不能将它从一个内存区域移动到另一个内存区域

例如,考虑一个保持指向字符串的指针的字符串对象。它可能是这样的:

    maps_mp = (mapInfo *) realloc(maps_mp, numMaps_m*sizeof(mapInfo));
class MyString
{
    char* inner_ptr;
    char buf[64];

    ...
};
MyString::MyString (const char* j)
{
     if (strlen(j) < 64)
         inner_ptr = buf;
     else
         inner_ptr = malloc (strlen(j) + 1);
     strcpy(inner_ptr, j);
}
它可能有这样一个构造函数:

    maps_mp = (mapInfo *) realloc(maps_mp, numMaps_m*sizeof(mapInfo));
class MyString
{
    char* inner_ptr;
    char buf[64];

    ...
};
MyString::MyString (const char* j)
{
     if (strlen(j) < 64)
         inner_ptr = buf;
     else
         inner_ptr = malloc (strlen(j) + 1);
     strcpy(inner_ptr, j);
}
现在,考虑一下如果在这些数组上调用relloc会发生什么。短字符串的内部_ptr仍将指向旧对象的缓冲区,您刚刚释放了该缓冲区

错误消息很好地解释了这个问题。使用realloc移动非平凡对象是不合法的。您必须构造一个新对象,因为该对象需要一个机会来处理其地址的更改

这是不明智的。如果一个对象是非平凡的,就不能将它从一个内存区域移动到另一个内存区域

例如,考虑一个保持指向字符串的指针的字符串对象。它可能是这样的:

    maps_mp = (mapInfo *) realloc(maps_mp, numMaps_m*sizeof(mapInfo));
class MyString
{
    char* inner_ptr;
    char buf[64];

    ...
};
MyString::MyString (const char* j)
{
     if (strlen(j) < 64)
         inner_ptr = buf;
     else
         inner_ptr = malloc (strlen(j) + 1);
     strcpy(inner_ptr, j);
}
它可能有这样一个构造函数:

    maps_mp = (mapInfo *) realloc(maps_mp, numMaps_m*sizeof(mapInfo));
class MyString
{
    char* inner_ptr;
    char buf[64];

    ...
};
MyString::MyString (const char* j)
{
     if (strlen(j) < 64)
         inner_ptr = buf;
     else
         inner_ptr = malloc (strlen(j) + 1);
     strcpy(inner_ptr, j);
}
现在,考虑一下如果在这些数组上调用relloc会发生什么。短字符串的内部_ptr仍将指向旧对象的缓冲区,您刚刚释放了该缓冲区


错误消息很好地解释了这个问题。使用realloc移动非平凡对象是不合法的。您必须构造一个新对象,因为该对象需要一个机会来处理其地址的更改。

您没有向我们显示完整的代码。realloc实际上在哪里?另外,为什么你不按照建议使用new和delete,以及为什么你要处理原始指针?还添加了“realloc”代码。“realloc”是从代码的其他部分完成的。“realloc”没有替代品。如果我删除析构函数代码部分,它将成功编译。此警告告诉您正在执行不安全的操作,即在非平凡的可复制类型上使用realloc。解决方案是不使用realloc。请发布一个您最初显示的内容。结果映射::addmapInfo&mapInfo\r当然无法编译,因为缺少声明。我可以使析构函数简单地可复制吗?如果是这样,gcc8也将使用“realloc”编译。您没有向我们显示完整的代码。realloc实际上在哪里?另外,为什么你不按照建议使用new和delete,以及为什么你要处理原始指针?还添加了“realloc”代码。“realloc”是从代码的其他部分完成的。“realloc”没有替代品。如果我删除析构函数代码部分,它将成功编译。此警告告诉您正在执行不安全的操作,即在非平凡的可复制类型上使用realloc。解决方案是不使用realloc。请发布一个您最初显示的内容。结果映射::addmapInfo&mapInfo\r当然无法编译,因为缺少声明。我可以使析构函数简单地可复制吗?如果是这样,gcc8也将使用“realloc”编译。