#include LinkedList::LinkedList() { this->first = NULL; this->last = NULL; this->size" />

在另一个类中完成删除时,Valgrind错误

116 观看

1回复

1429 作者的声誉

我试图在对象局部性较低时测试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;
}

这是valgrind的输出:

==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 main.cpp -o main

作者: sestus 的来源 发布者: 2016 年 1 月 7 日

回应 (1)


2

4856 作者的声誉

决定

您认为该变量i在此代码中做什么?

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

大小应减小,因此增大i时,只删除一半原始节点。

您没有显示所有代码,因此我必须假设缺少的部分是普通的。但是基于此假设,上面的代码应该是:

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

和其他列表类似。

作者: JSF 发布者: 07.01.2016 10:34
32x32