指向同一地址的两个指针

当两个指针指向同一个地址时会发生什么? 这会导致安全问题吗?

事实本身是可以的,但是如果你在其中一个指针上调用delete并且之后尝试使用另一个指针,你将遇到未定义的行为:

 int* x = new int(5); int* y = x; delete x; //y is a dangling pointer 

如果遇到必须使用多个指向同一内存地址的情况,你应该研究智能指针

拥有多个指向同一地址的指针是安全的,但请确保您知道如果使用delete内存,或者原始变量超出范围,则将无法进一步访问它。

要看:

对于经典(非智能)指针 :您可以有多个指针指向相同的内存位置,但操纵位置将在所有指针上渗透。 当使用其他指针时,删除/释放一个指针的存储将导致未定义的行为。 请注意,最佳做法是在释放存储后使指针为NULL以防止双重删除,并且在使用多个指针时,这不是实用的合理。

智能指针

Auto_Pointers(C ++ 98) :C ++模板类实现提供了一种机制,允许一个且只有一个指针指向一个内存位置。 通常,这些指针在堆栈上实现为对象,当它们超出范围时,地址将自动释放。 但是将一个指针复制到另一个指针会使另一个指针无法使用。

Shared_Pointers(C ++ 2003 TR1) :Boost库提供了共享指针,它具有一个引用计数,用于确定何时可以释放对象。 这比auto_ptrs好,因为你可以有多个可用的指针共享相同的内存位置。

Unique_Pointers(C ++ 11) :与Auto_pointers类似,但inheritance了未公开赋值和复制构造函数的所有权转移的概念。 相反,实施移动方法以使其更清楚意图是什么。

如果两个指针的类型相同,则没有问题:

 int a = 42; int *p = &a int *q = p; *p = 3145; // no problem, a and *q are now also equal 3145 

如果两个指针都是不同类型( char *除外)并指向同一个对象,则取消引用其中一个指针是未定义的行为。

 float a = 42.0f; float *p = &a; int *q = (int *) p; // we assume pointer is correctly aligned *q = 0; // undefined behavior, it breaks aliasing rules 

这些规则称为C指针别名规则。 您可以在第6.5p7段的n1570.pdf中找到C别名规则的列表。

两个对象都指向相同的堆地址。

在您将取消分配内存时,它可能会导致指向同一地址的其他对象出现问题。