调用C++函数而不进行对象初始化

Apo*_*yer 5 c++ pointers initialization object

为什么运行以下代码?

#include <iostream>
class A {
    int num;
    public:
        void foo(){ num=5; std::cout<< "num="; std::cout<<num;}
};

int main() {
    A* a;
    a->foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是

num=5
Run Code Online (Sandbox Code Playgroud)

我使用gcc编译它,我在第10行只得到以下编译器警告:

(警告:'a'在此函数中未初始化使用)

但根据我的理解,这段代码不应该根本不运行吗?当num不存在时,为什么将值5分配给num,因为还没有创建类型A的对象?

Mat*_*haq 2

你还没有初始化*a

尝试这个:

#include <iostream>

class A
{
    int num;
    public:
        void foo(){ std::cout<< "num="; num=5; std::cout<<num;}
};

int main()
{
    A* a = new A();
    a->foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

未正确初始化指针可能会导致未定义的行为。如果幸运的话,您的指针会指向堆中可供初始化的位置*。(假设执行此操作时没有引发异常。)如果不幸的话,您将覆盖用于其他目的的一部分内存。如果你真的很不幸,这将被忽视。

这不是安全代码;“黑客”可能会利用它。

*当然,即使您访问该位置,也不能保证它以后不会被“初始化”。


“幸运”(实际上,“幸运”会使调试程序变得更加困难):

// uninitialized memory 0x00000042 to 0x0000004B
A* a;
// a = 0x00000042;
*a = "lalalalala";
// "Nothing" happens
Run Code Online (Sandbox Code Playgroud)

“不幸”(使调试程序变得更容易,所以我真的不认为它“不幸”):

void* a;
// a = &main;
*a = "lalalalala";
// Not good. *Might* cause a crash.
// Perhaps someone can tell me exactly what'll happen?
Run Code Online (Sandbox Code Playgroud)