簡體   English   中英

由於非平凡的可復制類型,gcc8 拋出編譯錯誤

[英]gcc8 is throwing compilation error due to non-trivially copyable type

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

private:
    int *frequency;
};

//構造函數在這里定義。

    mapInfo::mapInfo() :
    dataType_m(0),
    frequency(NULL)
{
}  

//析構函數在這里定義

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 的編譯錯誤。

如何解決這個問題?

 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]. 

這根本不是正確的 C++。 如下重寫您的代碼(我在這里猜測的是frequency的類型,但絕對不要在上面free使用):

#include <vector>

class map_info
{
public:
    map_info();

private:
    int data_type;
    std::vector<int> frequency;
};
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);
}

    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);
}

和這樣的析構函數:

MyString::~MyString()
{
     if (buf != inner_ptr)
         free (inner_ptr);
}

現在,想想如果對這些數組調用relloc會發生什么。 短字符串仍將其inner_ptr指向舊對象的緩沖區,您剛剛釋放了該緩沖區。

錯誤消息很好地解釋了這個問題。 使用realloc移動非平凡對象是不合法的。 您必須構造一個新對象,因為該對象需要有機會處理其地址的變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM