繁体   English   中英

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

[英]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) != 0loc >= numItemsOnDay(dayIndex) 新项目的地址将存储在哪里? 如果你不在任何地方存储它,你就会有内存泄漏。

(顺便说一句,计算列表中元素的数量以查看它是否为空,这是不好的做法)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM