Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向同一地址的两个指针_C++_C_Pointers - Fatal编程技术网

C++ 指向同一地址的两个指针

C++ 指向同一地址的两个指针,c++,c,pointers,C++,C,Pointers,当两个指针指向同一地址时会发生什么情况?这会导致安全问题吗?事实本身是正常的,但是如果在其中一个指针上调用delete,然后尝试使用另一个指针,则会遇到未定义的行为: int* x = new int(5); int* y = x; delete x; //y is a dangling pointer 如果遇到必须使用多个指针指向同一内存地址的情况,则应查看智能指针多个指针指向同一地址是安全的,但请确保您知道,如果使用delete删除内存,或者如果原始变量超出范围,则无法定义对其的进一步访问

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

事实本身是正常的,但是如果在其中一个指针上调用
delete
,然后尝试使用另一个指针,则会遇到未定义的行为:

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

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

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

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

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

取决于:

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

智能指针

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

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


唯一指针(C++11):与自动指针类似,但继承了所有权转移的概念,其中未公开赋值和复制构造函数。而是实现了一个move方法,以便更清楚地了解其意图。

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

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段中找到C别名规则列表。

我认为当我们在其中一个指针上使用delete,然后尝试使用另一个指针时,就会出现指针悬空漏洞。@DaneshjuM这正是我所说的……如果我们不使用delete,而只是指向同一地址怎么办?另一个重要的情况是双自由/删除指针的指针。除了可靠性问题外,这还可能涉及到安全问题。在分配NULL之前,x仍然是悬空的指针……什么也不会发生。您遇到了什么问题?你写了什么代码?@Cody Gray。这只是为了我的利益当一个人有两个不同的名字时会发生什么?@Damien_The_异教徒:这取决于上下文和细节。指针不一定指向堆。tnx all。据我所知,我们必须使无法访问删除的指针地址