C++:链表中潜在的内存泄漏
C++: potential memory leak in linked list
我正在写一个class的链表,我觉得对于用于删除特定元素的成员函数可能会导致内存泄漏。代码如下。
struct node
{
int data;
node *next;
};
class linked_list
{
private:
node *head,*tail;
public:
linked_list()
{
head = NULL;
tail = NULL;
}
void add_node(int n)
{
node *tmp = new node;
tmp->data = n;
tmp->next = NULL;
if(head == NULL)
{
head = tmp;
tail = tmp;
}
else
{
tail->next = tmp;
tail = tail->next;
}
}
void DelElem(int locat)
{
int j{1};
node* tmp = new node;
if (locat == 1)
{
tmp = head->next;
head = tmp;
delete tmp;
}
else
{
node* n = head;
while (j < locat - 1)
{
n = n->next;
j++;
}
tmp = n->next;
n->next = tmp->next;
delete tmp;
}
}
对于函数'DelElem',我先用new操作符创建了一个指针tmp。但是,我为它分配了不同的地址,这意味着我在初始化时丢失了原始地址。
我该如何解决这个问题?
您的代码实例几乎没有问题,我已更正:-
-
正如其他人所指出的,您不需要使用 `new` 关键字来声明指针。
- 当一个尝试删除链表的第一个节点时,那么根据你的代码,它会删除第二个节点,因为以下
tmp = head->next;
head = tmp;
delete tmp;
这里,tmp
最初指向第二个节点,因为head->next
指的是第二个节点。因此,与其相反,它应该是这样的:-
tmp = head;
head = head->next;
delete tmp;
现在,tmp
将指向第一个节点,在第二行中,head
将指向第二个节点,然后tmp
指向的第一个节点被删除。
这是更正后的代码版本:-
struct node {
int data;
node* next;
};
class linked_list {
private:
node *head, *tail;
public:
linked_list()
{
head = NULL;
tail = NULL;
}
void add_node(int n)
{
node* tmp = new node;
tmp->data = n;
tmp->next = NULL;
if (head == NULL) {
head = tmp;
tail = tmp;
}
else {
tail->next = tmp;
tail = tail->next;
}
}
void DelElem(int locat)
{
int j{ 1 };
node* tmp;
if (locat == 1) {
tmp = head;
head = head->next;
delete tmp;
}
else {
node* n = head;
while (j < (locat - 1)) {
n = n->next;
j++;
}
tmp = n->next;
n->next = tmp->next;
cout << tmp->data;
delete tmp;
}
}
};
我正在写一个class的链表,我觉得对于用于删除特定元素的成员函数可能会导致内存泄漏。代码如下。
struct node
{
int data;
node *next;
};
class linked_list
{
private:
node *head,*tail;
public:
linked_list()
{
head = NULL;
tail = NULL;
}
void add_node(int n)
{
node *tmp = new node;
tmp->data = n;
tmp->next = NULL;
if(head == NULL)
{
head = tmp;
tail = tmp;
}
else
{
tail->next = tmp;
tail = tail->next;
}
}
void DelElem(int locat)
{
int j{1};
node* tmp = new node;
if (locat == 1)
{
tmp = head->next;
head = tmp;
delete tmp;
}
else
{
node* n = head;
while (j < locat - 1)
{
n = n->next;
j++;
}
tmp = n->next;
n->next = tmp->next;
delete tmp;
}
}
对于函数'DelElem',我先用new操作符创建了一个指针tmp。但是,我为它分配了不同的地址,这意味着我在初始化时丢失了原始地址。
我该如何解决这个问题?
您的代码实例几乎没有问题,我已更正:-
- 正如其他人所指出的,您不需要使用 `new` 关键字来声明指针。
- 当一个尝试删除链表的第一个节点时,那么根据你的代码,它会删除第二个节点,因为以下
tmp = head->next; head = tmp; delete tmp;
这里,
tmp
最初指向第二个节点,因为head->next
指的是第二个节点。因此,与其相反,它应该是这样的:-tmp = head; head = head->next; delete tmp;
现在,
tmp
将指向第一个节点,在第二行中,head
将指向第二个节点,然后tmp
指向的第一个节点被删除。
这是更正后的代码版本:-
struct node {
int data;
node* next;
};
class linked_list {
private:
node *head, *tail;
public:
linked_list()
{
head = NULL;
tail = NULL;
}
void add_node(int n)
{
node* tmp = new node;
tmp->data = n;
tmp->next = NULL;
if (head == NULL) {
head = tmp;
tail = tmp;
}
else {
tail->next = tmp;
tail = tail->next;
}
}
void DelElem(int locat)
{
int j{ 1 };
node* tmp;
if (locat == 1) {
tmp = head;
head = head->next;
delete tmp;
}
else {
node* n = head;
while (j < (locat - 1)) {
n = n->next;
j++;
}
tmp = n->next;
n->next = tmp->next;
cout << tmp->data;
delete tmp;
}
}
};