gpt4 book ai didi

c++ - 指针 C++ 的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 16:03:39 25 4
gpt4 key购买 nike

我是 C++ 的新手,我发现我已经被 Java 和 Swift 等更新的编程语言宠坏了。所以我明白有时你必须在 C++ 中手动删除对象,例如指针。您可以使用 delete 关键字,也可以使用智能指针。但是我对是否删除指针本身感到困惑,所以指针不能再次指向或者它是否删除了指针指向的位置。

我正在编写充当整数链表的代码。所以我有一个指向列表头部和尾部的指针。当有人“投票”某事时,它应该从列表中删除它,然后相应地重置头部(或尾部)。所以我有一些代码可以很好地满足我需要它做的事情:

int IntegerLinkedList::pollFirst(){
if (tail == nullptr && head == nullptr) {
return 0;
} else if (head == tail) {
int ret = head->getData();
head = nullptr;
tail = nullptr;
//delete head;
//delete tail;
return ret;
} else {
IntegerNode* newHead = head->getNext();
head->setNext(nullptr);
newHead->setPrevious(nullptr);
int ret = head->getData();
//delete head;
head = newHead;
return ret;
}
}

但我从来没有真正删除它指向的对象,我只是删除了所有指向它的指针。这会像在 Java 中那样删除对象吗?还是我必须手动删除它,我该怎么做?我内存泄漏了吗???非常感谢

还有更新头部的代码是

 void IntegerLinkedList::addFirst(int x){
IntegerNode* n = new IntegerNode(x);
if (head == nullptr && tail == nullptr) {
head = n;
tail = n;
} else {
head->setPrevious(n);
n->setNext(head);
head = n;
}
}

head在header中定义为

 IntegerNode* head;

最佳答案

Java 有一个垃圾收集器,基本上可以完成智能指针的工作。也就是说,当对对象的最后一次引用超出范围时,清理内存。

delete 关键字释放指针指向的位置的内存。它实际上并没有对指针变量本身做任何事情(它只是一个地址)。

更正代码的方法是:

else if (head == tail) { // suppose head = 0xAD4C0080
int ret = head->getData();
delete tail; // cleans memory at 0xAD4C0080, head and tail are still 0xAD4C0080
head = nullptr; // now head = 0
tail = nullptr; // now tail = 0
return ret;
} else {
IntegerNode* newHead = head->getNext();
head->setNext(nullptr);
newHead->setPrevious(nullptr);
int ret = head->getData(); // obtain data while head still exists
delete head; // get rid of head
head = newHead; // remove stray reference to deleted memory
return ret;
}

如果您在这些示例中调用 delete 后尝试使用值 0xAD4C0080,您将遇到段错误。

至于智能指针(引用您的评论):

yes the smart pointers, but do they delete what it is pointing at or just themselves

智能指针在自身被解构(通常是超出范围)时会删除它们所指向的内容。即

void func() {
std::unique_ptr<int> pInt(new int);
} // pInt falls out of scope, std::unique_ptr<int>::~std::unique_ptr<int>() called

关于c++ - 指针 C++ 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39239741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com