奇怪的容器内存泄漏

Posted

技术标签:

【中文标题】奇怪的容器内存泄漏【英文标题】:weird container memory leak 【发布时间】:2014-06-24 13:27:50 【问题描述】:

我正在尝试使用链表方法构建我自己版本的 std 容器之一。每次获得新数据时,我都会创建一个新节点并将其放入容器中。 D'tor 会在容器销毁时销毁所有节点。

奇怪的是,在进行泄漏检查(使用 valgrind)之后,每次插入第一个数据时它都会说我有泄漏。这是插入代码:

template<typename A, typename T>
typename container<A, T>::Iterator Queue<A, T>::insert(
        const A& priority, const T& object) 
    Iterator head = this->begin();
    Iterator tail = this->begin();
    this->findElementPlace(priority, head, tail);
    Node<A, T> *newNode = new Node<A, T>(priority, object);
    head.node->next = newNode;
    newNode->next = (tail.node);
    ++head;
    (this->Psize)++;
    return head;

它一直将我引向这一行:

Node<A, T> *newNode = new Node<A, T>(priority, object);

Node 类非常基础:

template<typename A, typename T>

class Node 

public:
    Element<A, T> element;
    Node* next;
    Node() :
                element(), next(NULL) 
        
        Node(const A priority, const T data) :
                element(priority, data), next(NULL) 
        
        ~Node() 
        
    ;

第一个数据存储在哪里并不重要,它总是说特定数据不会被删除,尽管 D'tor 会处理它。它使用擦除功能从第一个到最后一个擦除所有元素。这是主循环:

while ((from < to) && (from < this->end())) 
    it.node->next = from.node->next;
    Iterator temp = from;
    ++from;
    delete temp.node;
    (this->Psize)--;

它删除迭代器“from”到迭代器“to”之间的所有节点,包括“from”,不包括“to”

有谁知道如何解决这个问题?

【问题讨论】:

任何你不使用某种形式的引用计数智能指针的原因,例如std::shared_ptr? 你的迭代器是什么样的? 【参考方案1】:

我发现了问题。 迭代器包含一个索引参数,operatorend()”都被重新计算,但迭代器“from”和“to”不再相关,因为它们的索引不再相关。 我对其索引添加了更新,以便这次容器中的所有元素都将被释放。 新的擦除循环是:

while ((from < to) && (from < this->end())) 
    it.node->next = from.node->next;
    Iterator temp = from;
    from.index--;
    ++from;
    delete temp.node;
    (this->Psize)--;
    to.index--;

【讨论】:

以上是关于奇怪的容器内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 帮助:CoreLocation 框架中的奇怪内存泄漏

C++ 中的 new/delete 导致奇怪的内存泄漏

初始化推送通知时发生奇怪的 ionic 内存泄漏导致冻结

在 ARC 中使用 Blocks 和以某种方式复制的奇怪内存泄漏

使用 Eigen 和 boost::thread 在 C++ 中出现奇怪的内存泄漏

fprintf 内存泄漏