C++内存泄漏动态分配的2D数组和链表



几个小时以来,我一直在与内存泄漏作斗争,我不确定问题出在哪里。

我的错误是:

==3914== 96 (48 direct, 48 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 3
==3914==    at 0x4C2E17F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3914==    by 0x401F0E: DailyTodoList::insert(unsigned long, unsigned long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) (todolist.cpp:86)

我使用以下方式分配:Item* newItem = new Item(val, NULL, NULL); if (newItem == NULL) throw std::bad_alloc();

它被添加到一个数组中,其中每个索引都持有一个链表的头。下面是一个例子:

if(numItemsOnDay(dayIndex) == 0)
{
data_[dayIndex] = newItem;
}
//new head and items already exist in the list
else if(loc == 0 && loc < numItemsOnDay(dayIndex))
{
Item* tmp = data_[dayIndex];
data_[dayIndex] = newItem;
newItem->nextItem = tmp;
}

我用析构函数清除了所有东西

DailyTodoList::~DailyTodoList()
{
Item* temp;
Item* another;
for (size_t i = 0; i < cap_; i++)
{
temp = data_[i];
if (temp != NULL)
{
while (temp->nextItem != NULL)
{
another = temp->nextItem;
delete temp;
temp = another;
}
delete temp;
}
}
delete[] data_;
}

如果有任何帮助,我将不胜感激。提前谢谢。

查看您提供的小代码,您似乎正在做这样的事情:

Item* newItem = new Item(val, NULL, NULL);
if (some_test())
put_newItem_somewhere();
else if (some_other_test())
put_newItem_somewhere_else();

但如果两项测试都失败了怎么办?在您的情况下,如果是numItemsOnDay(dayIndex) != 0loc >= numItemsOnDay(dayIndex)。新项目的地址将存储在哪里?如果你不把它存储在任何地方,你就会有内存泄漏。

(顺便说一句,计算列表中元素的数量,看看它是否为空,这是一种糟糕的做法(

最新更新