当两个指针指向同一个地址时会发生什么?这会导致安全问题吗?
答案 0 :(得分:11)
事实本身还可以,但是如果你在其中一个指针上调用delete
并且之后尝试使用另一个指针,你将遇到未定义的行为:
int* x = new int(5);
int* y = x;
delete x;
//y is a dangling pointer
如果您遇到必须使用多个指向同一内存地址的情况,您应该查看智能指针。
答案 1 :(得分:3)
指向同一地址有多个指针是安全的,但请确保您知道如果使用delete
删除内存,或者原始变量超出范围,则进一步访问它不确定。
答案 2 :(得分:3)
取决于:
对于经典(非智能)指针:您可以使用多个指针指向相同的内存位置,但操作位置将在所有指针上进行渗透。当使用其他指针时,删除/释放一个指针的存储将导致未定义的行为。请注意,最佳做法是在释放存储空间后使指针为NULL以防止双重删除,并且在使用多个指针时这不是实用的合理。
Auto_Pointers(C ++ 98):C ++模板类实现提供了一种机制,允许一个且只有一个指针指向一个内存位置。通常,这些指针在堆栈上实现为对象,当它们超出范围时,地址将自动释放。但是,将一个指针复制到另一个指针会使另一个指针无法使用。
Shared_Pointers(C ++ 2003 TR1):Boost库提供了共享指针,它具有一个引用计数,用于确定何时可以释放对象。这比auto_ptrs好,因为你可以有多个可用的指针共享相同的内存位置。
Unique_Pointers(C ++ 11):与Auto_pointers类似,但继承了未公开赋值和复制构造函数的所有权转移的概念。相反,实施移动方法以使其更清楚意图是什么。
答案 3 :(得分:2)
如果两个指针的类型相同,则没有问题:
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别名规则的列表。
答案 4 :(得分:0)
两个对象都指向相同的堆地址。
当您取消分配内存时,它可能会导致指向同一地址的其他对象出现问题。