动态指针赋值c ++

时间:2016-04-05 20:07:29

标签: c++ pointers dynamic memory-address

2。 鉴于定义,

int *p1, *p2;
p1 = new int;
p2 = new int;

以下两项作业之间有什么区别。

a) p1 = p2;
b) *p1 = *p2 

2 个答案:

答案 0 :(得分:3)

你忘记提及语言,但我猜你的意思是C或C ++。

a)简单的地址标注。 p1将指向p2。所以你最终会得到两个指向int实例的指针。这意味着,你通过覆盖它来松散指向p1的指针,但它的内容将保留在内存 unfreed 中,你将无法释放它甚至访问它! (如果你没有在其他地方复制p1 ...)使用valgrind来查看。但是,当你调用delete p1时,你可以释放偶数int,p2指向。 p2的任何使用都可能最终导致分段错误。

b)您将p2的值分配给p1,这意味着您最终得到两个动态分配的指针,两者的值均为p2。但它们将是int的两个不同的独立实例!因此,如果您delete p1p2仍然可以访问。

答案 1 :(得分:1)

a)您将p2(地址)分配给p1.So当您取消引用p1时,您将获得与* p2相同的值。如果你改变* p2比* p1也会改变。基本上,在这种类型的赋值中,p1和p2都指的是相同的地址位置。这会产生内存泄漏,因为分配给p1的地址不再被引用。

b)在这种情况下,* p2中的值被分配给* p1。但他们仍然指向不同的地址位置。如果在赋值后更改* p2的值,则不会更改* p1。