我创建了这段小代码来测试“copyMemZone”函数,该函数允许我从内存区域提取数据。
在下面的示例中,参数是手动输入的(用于测试),但必须在更完整的程序中使用此代码。
我不觉得我犯了错误,但 QT 向我显示以下消息:
Potential leak of memory pointed to by 'dataSource' [clang-analyzer-unix.Malloc]
对于以下行:
unsigned char* dataDest = (unsigned char*)malloc(sizeMaxDest*sizeof(unsigned char));`
此消息正常吗?
我的代码写错了吗?
int copyMemZone(unsigned char* zoneSourceFonc, size_t debutSourceFonc, size_t finSourceFonc, unsigned char** zoneDestFonc);
int copyMemZone(unsigned char *zoneSourceFonc, size_t debutSourceFonc, size_t finSourceFonc, unsigned char **zoneDestFonc)
{
// Initialization
int cursorMem = 0;
if(finSourceFonc>debutSourceFonc)
{
// For each Character to Copy
for (size_t i = debutSourceFonc; i < finSourceFonc; i++)
{
// Memorization
(*zoneDestFonc)[cursorMem] = zoneSourceFonc[i];
cursorMem++;
}
}
return EXIT_SUCCESS;
}
int main()
{
// Initialization
int sizeSource = 10; // Size of Source Memory
int beginMemo = 2; int endMemo = 8; // Parameters to copy (to extract) caracters
int sizeMaxDest = 10; // Size of Destination Memory
// Memory Allocation
unsigned char* dataSource = (unsigned char*)malloc(sizeSource*sizeof(unsigned char));
if(dataSource==NULL) return EXIT_FAILURE;
// Mémorisation
dataSource[0] = '0';
dataSource[1] = 'X';
dataSource[2] = 'M';
dataSource[3] = 'E';
dataSource[4] = 'M';
dataSource[5] = 'O';
dataSource[6] = 'R';
dataSource[7] = 'Y';
dataSource[8] = '8';
dataSource[9] = '7';
// Memory Allocation
unsigned char* dataDest = (unsigned char*)malloc(sizeMaxDest*sizeof(unsigned char));
if(dataDest==NULL) return EXIT_FAILURE;
int tailleDest = endMemo-beginMemo;
// Copying the Memory Area
copyMemZone((unsigned char*)dataSource,beginMemo,endMemo,&dataDest);
// Display after copying
for(int i=0;i<tailleDest;i++) qDebug() << QChar(dataDest[i]);
// Free Memory
free(dataDest);
free(dataSource);
}
如果
dataSource
到 malloc
失败,您不会释放 dataDest
。
另外,最好使用
nullptr
而不是 NULL
。
您应该将代码更改为以下内容:
if (dataDest == nullptr)
{
free(dataSource);
return EXIT_FAILURE;
}
此外,与其使用
malloc
/new
动态分配内存并稍后使用 free
/delete
释放内存,也许最好使用 std::vector
。