指针复制到另一个指针时如何工作
Pointers how it works when copied to another pointer
大家好。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int* ptr1 = new int;
int* ptr2 = ptr1;
delete ptr2; // Detroying ptr2
return 0;
}
在上述情况下,ptr1 使用的内存将被释放,还是仅 ptr2 将被销毁。
我还有一个疑问。我有一个树状结构,其中节点指向两个 children(这些 children 有叶节点,考虑它是一棵大树)。如果我必须删除根节点的一个child,是否需要删除grand children,grand grand children等的每个指针object?
提前致谢?
ptr2和ptr1指向的int都将被释放。 delete 运算符释放指针指向的对象,而不是指针本身。 (指针在删除后仍然存在,但它们现在是“悬挂指针”,指向不再属于您的内存)
关于删除树结构,是的,你需要递归删除,一直到叶子。通常这是在 node-class 的析构函数方法内部完成的并且非常简单(只需在每个直接子节点上调用 delete ,这将导致它们的析构函数方法执行并删除它们的每个子节点,等等)
这部分:
new int;
正在为稍后将被删除的 int
分配内存。该内存的位置是指针的值。您可以让任意数量的指针指向该内存,所有指针都将具有相同的值。当删除该内存时,指针的值仍然相同,您只是不应该取消引用指针,因为它们现在指向已删除的内存
#include <iostream>
int main() {
int* ptr1 = new int;
int* ptr2 = ptr1;
// When I ran this the output was: 0x7fe835402a40 0x7fe835402a40
std::cout << ptr1 << ' ' << ptr2 << std::endl;
delete ptr1;
// Output is still: 0x7fe835402a40 0x7fe835402a40
std::cout << ptr1 << ' ' << ptr2 << std::endl;
return 0;
}
关于你的第二个问题,你不是删除指针,而是删除指针指向的内存。如果后面的节点有你想释放的内存那么是的,你将不得不递归地删除那些
大家好。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int* ptr1 = new int;
int* ptr2 = ptr1;
delete ptr2; // Detroying ptr2
return 0;
}
在上述情况下,ptr1 使用的内存将被释放,还是仅 ptr2 将被销毁。 我还有一个疑问。我有一个树状结构,其中节点指向两个 children(这些 children 有叶节点,考虑它是一棵大树)。如果我必须删除根节点的一个child,是否需要删除grand children,grand grand children等的每个指针object? 提前致谢?
ptr2和ptr1指向的int都将被释放。 delete 运算符释放指针指向的对象,而不是指针本身。 (指针在删除后仍然存在,但它们现在是“悬挂指针”,指向不再属于您的内存)
关于删除树结构,是的,你需要递归删除,一直到叶子。通常这是在 node-class 的析构函数方法内部完成的并且非常简单(只需在每个直接子节点上调用 delete ,这将导致它们的析构函数方法执行并删除它们的每个子节点,等等)
这部分:
new int;
正在为稍后将被删除的 int
分配内存。该内存的位置是指针的值。您可以让任意数量的指针指向该内存,所有指针都将具有相同的值。当删除该内存时,指针的值仍然相同,您只是不应该取消引用指针,因为它们现在指向已删除的内存
#include <iostream>
int main() {
int* ptr1 = new int;
int* ptr2 = ptr1;
// When I ran this the output was: 0x7fe835402a40 0x7fe835402a40
std::cout << ptr1 << ' ' << ptr2 << std::endl;
delete ptr1;
// Output is still: 0x7fe835402a40 0x7fe835402a40
std::cout << ptr1 << ' ' << ptr2 << std::endl;
return 0;
}
关于你的第二个问题,你不是删除指针,而是删除指针指向的内存。如果后面的节点有你想释放的内存那么是的,你将不得不递归地删除那些