在另一个 class 中完成删除时出现 Valgrind 错误
Valgrind errors when delete is done in another class
我正在尝试在对象局部性较低时测试 C++ 性能,因此我正在尝试分配具有许多 "dead objects" 的大量内存。当它们之间有很多 "dead ones" 时,我将对 "live objects" 进行基准测试。
为此,我定义了一个简单的链表:
#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
您认为变量 i
在此代码中的作用是什么?
for (i=0; i < dead_node_list->getSize(); i++)
dead_node_list->deleteFirst();
大小应该会下降,所以随着 i
的增加,你只删除了一半的原始节点。
你没有给出所有的代码,所以我不得不假设缺少的部分是普通的。但是有了这个假设,上面的代码应该是:
while ( dead_node_list->getSize())
dead_node_list->deleteFirst();
与其他列表类似。
我正在尝试在对象局部性较低时测试 C++ 性能,因此我正在尝试分配具有许多 "dead objects" 的大量内存。当它们之间有很多 "dead ones" 时,我将对 "live objects" 进行基准测试。
为此,我定义了一个简单的链表:
#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
您认为变量 i
在此代码中的作用是什么?
for (i=0; i < dead_node_list->getSize(); i++)
dead_node_list->deleteFirst();
大小应该会下降,所以随着 i
的增加,你只删除了一半的原始节点。
你没有给出所有的代码,所以我不得不假设缺少的部分是普通的。但是有了这个假设,上面的代码应该是:
while ( dead_node_list->getSize())
dead_node_list->deleteFirst();
与其他列表类似。