相关疑难解决方法(0)

删除后在c ++中的指针

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

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++ pointers c++11 c++14

12
推荐指数
2
解决办法
1484
查看次数

取消引用已删除的指针总是会导致访问冲突?

我这里有一个非常简单的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(启动而不调试)不会'导致任何崩溃.有什么区别?

我还想知道是否可以稳定地重现因访问已删除区域而导致的访问冲突崩溃?现实生活中这种崩溃难得一见吗?

c++ memory crash pointers visual-c++

10
推荐指数
3
解决办法
2924
查看次数

为什么在C++中通过空指针调用方法"工作"?

可能重复:
通过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()成员函数中使用?

c++

8
推荐指数
2
解决办法
9040
查看次数

为什么这句话:"未定义的行为意味着编译器可以做任何想做的事情"是真的吗?

具体参考:https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p = 633 /

我是一名新的C++程序员,我目前正在学习未定义的行为及其对程序的影响.我特意链接到上面的博客,该博客说当发生未定义的行为时,任何事情都可能发生.

它特别提到了几次,当发生未定义的行为时,编译器可以允许任何事情发生.

具体是什么导致这种情况发生,为什么会发生?

c++ compiler-construction undefined-behavior

6
推荐指数
2
解决办法
321
查看次数