[英]C++ Memory Leak Dynamically allocated 2D array and Linked List
几个小时以来,我一直在为内存泄漏而苦苦挣扎,但我不确定问题是什么。
我的错误是这样的:
==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();
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) != 0
和loc >= numItemsOnDay(dayIndex)
。 新项目的地址将存储在哪里? 如果你不在任何地方存储它,你就会有内存泄漏。
(顺便说一句,计算列表中元素的数量以查看它是否为空,这是不好的做法)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.