1个块中的0个字节肯定丢失在丢失记录1 of 1中

0 bytes in 1 blocks are definitely lost in loss record 1 of 1

我在学校 java 学习 C/C++ 作为新人,由于是周末,我无法从那里获得帮助。我收到这样的错误:

==18== 0 bytes in 1 blocks are definitely lost in loss record 1 of 1
==18==    at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==18==    by 0x109536: Table::Table(unsigned long) (taul2.cpp:38)
==18==    by 0x1093CF: main (taul2.cpp:108)

主要内容:

  Table nums(7);
  nums.add(1); nums.add(2);
  cout << nums<< endl;
  Table nums2;
  taul.place(nums);
  cout << nums2<< endl;

  Table nums3;  // line 108
  cout << nums3 << endl;

  return 0;

Table:

class Table{
    size_t max_size;
    size_t amount;
    int *numbers;
    int fail;
public:
Table(size_t size=0) 
{
    fail= 0;
    max_size = 0;
    numbers = new int[size]; // line 38
    if ( numbers ) max_size = size;
    lkm = 0;
}
  ~Table() { if ( max_size != 0 ) delete [] numbers; max_size = 0; }
/* ... */
}

错误仅发生在长度为 0 的 nums3 上,调试器显示它转到 ~Table 方法,就像所有其他方法一样,但它是唯一有错误的 1。

即使你new 0字节,你还是要delete它。对于每次分配,都会有一些额外的开销超出您要求的字节数。 (例如,堆中的条目、指针本身等...)。

旁注:new items[0] 不 return nullptr。即使是这样,delete [] nullptr 也完全可以而且安全。

更改析构函数
~Table() { if ( max_size != 0 ) delete [] numbers; max_size = 0; }

为此:

~Table() { 
    delete [] numbers;
}