QT - “潜在内存泄漏”警告

问题描述 投票:0回答:1

我创建了这段小代码来测试“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);
}
c++ qt memory-leaks
1个回答
0
投票

如果

dataSource
malloc
失败,您不会释放
dataDest

另外,最好使用

nullptr
而不是
NULL

您应该将代码更改为以下内容:

if (dataDest == nullptr)
{
    free(dataSource);
    return EXIT_FAILURE;
}

此外,与其使用

malloc
/
new
动态分配内存并稍后使用
free
/
delete
释放内存,也许最好使用
std::vector

© www.soinside.com 2019 - 2024. All rights reserved.