函数结束后指针会死亡吗?
Do pointers die after function ends?
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
返回的指针指向分配的内存(。当函数返回时,指针"死亡",但分配的内存仍处于分配状态。
- 在函数结束后使用指向变量的指针是否安全?
- 取消引用结束指针到数组类型的一个
- 获取指向派生类的指针在 C++ 中以运行时异常结束
- 函数结束后指针会死亡吗?
- 函数结束后覆盖的指针
- C 指针数组使用STL开始和结束
- GNUPLOT C API如何知道指针在哪里结束
- C++ 指针上的开始/结束 (arr) - 调用 'begin(int**&)' 没有匹配函数
- 指针范围结束后,C 在堆上访问对象
- 重载指向集合的指针的开始/结束是否是个好主意
- 当c++程序结束时,指针会从内存中释放吗
- 向量中指针的前半部分在循环结束后被重新分配
- 访问存储在开始指针和结束指针之间的值
- 函数结束后丢失指针数据
- 在范围结束后提升共享指针"runtime error"
- 字符指针的二维数组是否需要以两个null结束?
- 当构造函数运行结束时,指针变为空
- 如何封送一个指向一系列以空结束的字符串的指针
- 当引用指向指针(堆中的对象)的对象时,引用作用域结束
- C++ 作用域结束后丢失指针引用