删除后在c ++中的指针

Pro*_*234 12 c++ pointers c++11 c++14

在阅读了很多关于此的帖子后,我想澄清下一点:

A* a = new A();
A* b = a;

delete a;

A* c = a; //illegal - I know it (in c++ 11)
A* d = b; //I suppose it's legal, is it true?
Run Code Online (Sandbox Code Playgroud)

所以问题是关于使用已删除指针的副本.

我读过,在c ++ 11中读取a导致未定义行为的价值 - 但是读取它的价值b呢?

尝试读取指针的值(注意:这与解除引用它不同)会导致自C++ 14以来的实现定义行为,其中可能包括生成运行时错误.(在C++ 11中它是未定义的行为) 删除后指针本身会发生什么?

Man*_*rse 29

都:

A* c = a;
A* d = b;
Run Code Online (Sandbox Code Playgroud)

在C++ 11中是未定义的,在C++ 14中定义的实现是未定义的.这是因为a并且b都是"无效指针值"(因为它们指向解除分配的存储空间),并且"使用无效指针值"是未定义的或实现定义的,具体取决于C++版本.("使用"包括"复制"的值).

[basic.stc.dynamic.deallocation]/4C++ 11中的相关部分()读取(强调添加):

如果给标准库中的释放函数赋予的参数是一个不是空指针值的指针(4.10),则释放函数将释放指针引用的存储,使所有指向解除分配存储的任何部分的指针无效..使用无效指针值(包括将其传递给释放函数)的效果未定义.

用非规范性说明说明:

在某些实现中,它会导致系统生成的运行时

在C++ 14中,相同的部分内容如下:

如果给标准库中的释放函数赋予的参数是一个不是空指针值的指针(4.10),则释放函数将释放指针引用的存储,使所有指向解除分配存储的任何部分的指针无效..通过无效指针值间接并将无效指针值传递给释放函数具有未定义的行为.对无效指针值的任何其他使用都具有实现定义的行为.

用非规范性说明说明:

某些实现可能会定义复制无效指针值会导致系统生成的运行时错误


Sla*_*ica 1

这两行没有任何区别(意味着 C++ 的合法性):

A* c = a; //illegal - I know it (in c++ 11)
A* d = b; //I suppose it's legal, is it true?
Run Code Online (Sandbox Code Playgroud)

你的错误(这是很常见的)认为如果你调用deletea,它就会与b. 您应该记住,当您调用delete指针时,您按值传递参数,因此a指向 after 的内存delete不再可用,但该调用a与您的示例中没有任何不同b

  • 是的,它从 valid 变为 invalid ,并且您的断言可能会失败或导致 C++14 中的硬件故障(或者在 C++11 中恶魔会从您的鼻子里飞出来) (2认同)