2。 鉴于定义,
int *p1, *p2;
p1 = new int;
p2 = new int;
以下两项作业之间有什么区别。
a) p1 = p2;
b) *p1 = *p2
答案 0 :(得分:3)
你忘记提及语言,但我猜你的意思是C或C ++。
a)简单的地址标注。 p1
将指向p2
。所以你最终会得到两个指向int实例的指针。这意味着,你通过覆盖它来松散指向p1的指针,但它的内容将保留在内存 unfreed 中,你将无法释放它甚至访问它! (如果你没有在其他地方复制p1
...)使用valgrind来查看。但是,当你调用delete p1
时,你可以释放偶数int,p2
指向。 p2
的任何使用都可能最终导致分段错误。
b)您将p2的值分配给p1,这意味着您最终得到两个动态分配的指针,两者的值均为p2。但它们将是int的两个不同的独立实例!因此,如果您delete p1
,p2
仍然可以访问。
答案 1 :(得分:1)
a)您将p2(地址)分配给p1.So当您取消引用p1时,您将获得与* p2相同的值。如果你改变* p2比* p1也会改变。基本上,在这种类型的赋值中,p1和p2都指的是相同的地址位置。这会产生内存泄漏,因为分配给p1的地址不再被引用。
b)在这种情况下,* p2中的值被分配给* p1。但他们仍然指向不同的地址位置。如果在赋值后更改* p2的值,则不会更改* p1。