函数结束后指针会死亡吗?

Do pointers die after function ends?

本文关键字:结束 指针 函数      更新时间:2023-10-16
void add_first(int e) {
        Node* newest = new Node(e, first);
        first = newest;
        n++;
}

在此代码中,我声明了一个节点指针"最新"。

list->add_first(4);

假设我第二次调用该函数。

list->add_first(8)

从我第一次调用指向新节点的函数开始,它是否仍然是相同的*最新,或者之前的*最新是否在函数之后死亡,并且在第二个函数调用时生成了新的*最新?

完整代码,以防您需要额外信息

template <typename T>
class List {
struct Node {
T elem;
Node* next;
Node(T elem = 0, Node* next = nullptr) : elem(elem), next(next) {}
};
Node* first;
size_t n;
public:
List () : n(0), first(nullptr) {}
~List () {
while (first != nullptr) {
Node* aux = first;
first = first->next;
delete aux;
}
}
bool addFirst(T e) {
Node* newest = new Node(e, first);
first = newest;
n++;
return true;
}
bool add(T e, size_t p) {
if (p > n) return false;
if (p == 0) return addFirst(e);
Node* newest = new Node(e);
Node* aux = first;
size_t i = 1;
while (i++ < p) {
aux = aux->next;
}
newest->next = aux->next;
aux->next = newest;
n++;
return true;
}
bool addLast(T e) {
return add(e, n);
}
};
new Node(e, first)

将在堆上为Node类型的对象分配新内存,直到您使用delete手动释放它。如果不保留对它的引用,则无法解除分配它,并且存在内存泄漏。

Node* newest = ...;

将在堆栈上创建一个类型Node的指针,直到它超出范围(在本例中,当函数返回时(,对其进行初始化以引用您刚刚创建的对象。

重要的是要注意,newest不是对象;它只是暂时引用它。

first = newest;

这里没有提供first的类型,但大概是为了编译它,它是在更高的范围内定义的,例如成员变量,并接受类型Node*的赋值......所以这本身可能是一个Node*

在这种情况下,这将默认设置first引用newest指向的同一对象。在这种情况下,它指向newest,但两者现在都引用同一对象。

当函数返回时,newest(指针(将被销毁,因为它是在函数调用的范围内定义的,但您创建的Node对象将存在于堆上,以及引用它的first,因为它是在此范围之外定义的。

如果您立即再次调用此函数,例如在循环中,您将分配另一个类型Node的对象,将first设置为该对象,并且以前由first指向的对象现在在没有引用的情况下在堆上孤立。

编辑:我刚刚注意到您将first传递到构造函数中以进行Node,因此您可能在其中建立单独的连接。

当函数返回时,newest(即指针(会死亡(因为它是一个局部变量(。下次调用该函数时,将创建一个新的newest变量并再次销毁。

*newest(即它指向的对象(保持活动状态,直到您明确delete它(因为您使用new创建了它(

指针只是保存特定类型实例的内存地址的类型。在您的示例中,您使用new动态分配内存以存储Node实例,并将其地址存储到指针(请注意,new返回的指针指向分配的内存(。当函数返回时,指针"死亡",但分配的内存仍处于分配状态。