首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于不可复制类型,gcc8引发编译错误。

由于不可复制类型,gcc8引发编译错误。
EN

Stack Overflow用户
提问于 2020-09-03 19:58:04
回答 2查看 436关注 0票数 0
代码语言:javascript
复制
class mapInfo
{
public:
    mapInfo();
    ~mapInfo();  
public:
    int dataType_m;

private:
    int *frequency;
};

这里定义了//构造函数。

代码语言:javascript
复制
    mapInfo::mapInfo() :
    dataType_m(0),
    frequency(NULL)
{
}  

//析构函数在这里定义

代码语言:javascript
复制
mapInfo::~mapInfo()
{
    free(frequency);
    frequency = NULL;
}

Result_t Maps::add(mapInfo &mapInfo_r)
{
    if (maps_mp == NULL)
    {
        numMaps_m = 1;
        maps_mp = (mapInfo *) calloc(1, sizeof(mapInfo));
    }
    else
    {
        numMaps_m++;
        maps_mp = (mapInfo *) realloc(maps_mp, numMaps_m*sizeof(mapInfo));
    }
    maps_mp[numMaps_m-1] = mapInfo_r; // Default copy constructor
    return 1;
}

使用gcc8进行编译时,将获得以下编译错误。它看起来像上面那样定义了析构函数,给出了gcc8的编译错误。

如何解决这个问题?

代码语言:javascript
复制
 error: 'void* realloc(void*, size_t)' moving an object of non-trivially copyable type 'class xyyz::mapInfo'; use 'new' and 'delete' instead [-Werror=class-memaccess]. 
EN

回答 2

Stack Overflow用户

发布于 2020-09-03 20:32:57

这是不恰当的C++。按照以下方式重写代码(我在这里猜测frequency的类型,但绝对不要在其上使用free ):

代码语言:javascript
复制
#include <vector>

class map_info
{
public:
    map_info();

private:
    int data_type;
    std::vector<int> frequency;
};
代码语言:javascript
复制
std::vector<map_info> maps_mp;

map_info::map_info() : data_type(0), frequency() {}

// …

void maps::add(map_info& map_info)
{
    maps_mp.push_back(map_info);
}
票数 2
EN

Stack Overflow用户

发布于 2020-09-03 21:02:01

代码语言:javascript
复制
    maps_mp = (mapInfo *) realloc(maps_mp, numMaps_m*sizeof(mapInfo));

这是不明智的。如果一个对象不是简单的,你就不能把它从一个内存树移动到另一个内存中。

例如,考虑一个保存指向字符串的指针的string对象。看起来可能是这样的:

代码语言:javascript
复制
class MyString
{
    char* inner_ptr;
    char buf[64];

    ...
};

它可能有这样的构造函数:

代码语言:javascript
复制
MyString::MyString (const char* j)
{
     if (strlen(j) < 64)
         inner_ptr = buf;
     else
         inner_ptr = malloc (strlen(j) + 1);
     strcpy(inner_ptr, j);
}

像这样的破坏者:

代码语言:javascript
复制
MyString::~MyString()
{
     if (buf != inner_ptr)
         free (inner_ptr);
}

现在,考虑一下如果在这些数组上调用relloc会发生什么。短字符串的inner_ptr仍然指向旧对象的缓冲区,您刚刚将其解除分配。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63730836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档