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”编译。