8

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

4

5 回答 5

13

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

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

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

于 2012-04-29T08:08:07.817 回答
3

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

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 别名规则列表。

于 2012-04-29T10:22:33.580 回答
3

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

于 2012-04-29T08:13:58.140 回答
3

要看:

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

智能指针

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

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

Unique_Pointers(C++11):类似于 Auto_pointers,但继承了所有权转移的概念,其中不暴露赋值和复制构造函数。相反,实现了一个 move 方法以更清楚地说明意图是什么。

于 2012-04-29T08:18:07.853 回答
0

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

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

于 2012-04-29T08:17:07.167 回答