在阅读了很多关于此的帖子后,我想澄清下一点:
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中它是未定义的行为) 删除后指针本身会发生什么?
我这里有一个非常简单的C++代码:
char *s = new char[100];
strcpy(s, "HELLO");
delete [] s;
int n = strlen(s);
Run Code Online (Sandbox Code Playgroud)
如果我通过按F5(开始调试)从Visual C++ 2008运行此代码,这总是导致崩溃(访问冲突.)但是,在IDE外部启动此可执行文件,或使用IDE的Ctrl + F5(启动而不调试)不会'导致任何崩溃.有什么区别?
我还想知道是否可以稳定地重现因访问已删除区域而导致的访问冲突崩溃?现实生活中这种崩溃难得一见吗?
可能重复:
通过NULL类指针调用类方法
#include <iostream>
using namespace std;
class test
{
int i;
public:
test():i(0){ cout << "ctor called" << endl;}
void show()
{
cout<<"show fun called"<<endl;
}
};
int main(int argc , char *argv[])
{
test *ptr = NULL;
ptr->show();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
很明显,没有人会被召唤.这是标准吗?或者只是一些编译器优化,因为这个指针没有在show()成员函数中使用?
具体参考:https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p = 633 /
我是一名新的C++程序员,我目前正在学习未定义的行为及其对程序的影响.我特意链接到上面的博客,该博客说当发生未定义的行为时,任何事情都可能发生.
它特别提到了几次,当发生未定义的行为时,编译器可以允许任何事情发生.
具体是什么导致这种情况发生,为什么会发生?