代码之家  ›  专栏  ›  技术社区  ›  sestus

在另一个类中执行删除时出现Valgrind错误

  •  0
  • sestus  · 技术社区  · 8 年前

    我试图在对象局部性较低时测试c++性能,因此我试图分配大量内存,其中包含许多“死对象”。当“活物体”之间有许多“死物体”时,我将对它们进行基准测试。

    为此,我定义了一个简单的LinkedList:

    #include "LinkedList.hpp"
    #include <iostream>
    #include <string>
    
    LinkedList::LinkedList() {
        this->first = NULL;
        this->last = NULL;
        this->size = 0;
    }
    
    void LinkedList::add(node_t *node) {
        if (!last) {
            first = node;
            last = first;
            size++;
            return;
        }
        last->next = node;
        last = last->next;
        size++;
    }
    
    
    void LinkedList::deleteFirst() {
        if (first == NULL || size <= 0) {
            std::cout << "Cannot Delete from empty list" << std::endl;
            return;
        }
        node_t* oldfirst = first;
        first = first->next;
        delete oldfirst;
        size--;
    }
    

    标题文件:

    #ifndef LINKEDLIST_HPP
    #define LINKEDLIST_HPP
    
    class node_t {
        public:
            node_t *next;
    };
    
    
    class LinkedList {
    
        public:
            LinkedList();
            void add(node_t*);
            void deleteFirst();
            node_t *first;
            int size;
        private:
            node_t *last;
    };
    
    #endif
    

    在尝试实验时,我注意到valgrind显示我有一些内存泄漏。我很确定我正在删除每个分配的对象。以下是我的主要内容:

    #include "LinkedList.hpp"
    #include <ctime>
    #include <cstdlib>
    
    bool doConnect() {
        int  r;
        r = rand();
    
        return ((r % 2) == 1);
    }
    
    int main() {
    
        srand(time(NULL));
        int size = 100000;
        int i = 0;
        LinkedList *node_list = new LinkedList();
        LinkedList *dead_node_list = new LinkedList();
    
    
        for (i=0; i < size; i++) {
            node_t *new_node = new node_t();
            if (doConnect()) {
                node_list->add(new_node);
            }
            else {
                dead_node_list->add(new_node);
            }
        }
    
    
        for (i=0; i < dead_node_list->getSize(); i++)
                dead_node_list->deleteFirst();
    
        for (i=0; i < node_list->getSize(); i++)
                node_list->deleteFirst();
    
        delete node_list;
        delete dead_node_list;
    
    
    
        return 0;
    }
    

    这是瓦尔格林的输出:

    ==15291== Memcheck, a memory error detector
    ==15291== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
    ==15291== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
    ==15291== Command: ./main
    ==15291== 
    ==15291== 
    ==15291== HEAP SUMMARY:
    ==15291==     in use at exit: 199,720 bytes in 24,965 blocks
    ==15291==   total heap usage: 100,002 allocs, 75,037 frees, 800,048 bytes allocated
    ==15291== 
    ==15291== LEAK SUMMARY:
    ==15291==    definitely lost: 16 bytes in 2 blocks
    ==15291==    indirectly lost: 199,704 bytes in 24,963 blocks
    ==15291==      possibly lost: 0 bytes in 0 blocks
    ==15291==    still reachable: 0 bytes in 0 blocks
    ==15291==         suppressed: 0 bytes in 0 blocks
    ==15291== Rerun with --leak-check=full to see details of leaked memory
    ==15291== 
    ==15291== For counts of detected and suppressed errors, rerun with: -v
    ==15291== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
    

    我是不是遗漏了一些明显的东西?

    我用:g++-Wall-g LinkedList编译代码。cpp主。cpp-o主

    1 回复  |  直到 8 年前
        1
  •  2
  •   JSF    8 年前

    你认为变量是什么 i 在这个代码中做什么?

    for (i=0; i < dead_node_list->getSize(); i++)
            dead_node_list->deleteFirst();
    

    尺寸应该会变小,所以 向上,只删除一半原始节点。

    你没有显示所有的代码,所以我不得不假设缺失的部分是普通的。但在这种假设下,上述代码应该是:

    while ( dead_node_list->getSize())
            dead_node_list->deleteFirst();
    

    对于另一个列表类似。