微小的崩溃程序

use*_*352 0 c++ debugging pointers g++ class

以下程序使用g ++编译,但在运行时崩溃:

class someClass
{
public:
    int const mem;
    someClass(int arg):mem(arg){}
};

int main()
{
    int arg = 0;
    someClass ob(arg);

    float* sample;
    *sample = (float)1;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下程序不会崩溃:

int main()
{

    float* sample;
    *sample = (float)1;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 8

float* sample;
*sample = (float)1;
Run Code Online (Sandbox Code Playgroud)

sample永远不会初始化为指向一个对象,所以当你取消引用它时,你的程序会崩溃.您需要在使用它之前对其进行初始化,例如:

float f;
float* sample = &f;
*sample = (float)1;
Run Code Online (Sandbox Code Playgroud)

你的第二个程序仍然是错误的,即使它没有崩溃.取消引用不指向有效对象的指针会导致未定义的行为.结果可能是您的程序崩溃,内存中的其他一些数据被覆盖,您的应用程序似乎继续正常运行,或任何其他结果.您的程序今天看起来运行正常,但明天运行时会崩溃.

  • 这不是编译器的错,你不知道你在做什么.这就像归咎于锤子,因为你有一个萝卜的灵巧和击中你的手. (5认同)
  • @drenami:"我责怪编译器." 怪你自己.你不会学习如何以艰难的方式驾驶直升机,然后责怪直升机坠毁,对吧? (4认同)
  • ......这是一个不学习100%"艰难道路"的好理由.你会像这样的东西一直在追逐野鹅. (2认同)