C ++对象指针的内存分配

3
#include <iostream>
using namespace std;

class test
{
public:
    int a,b[100];
    test() {
        cout << "Constructor called" << " \n " ;
        a=10;
    }
};

int main()
{
    test a1;    
    test *b2;      
    test *pointer = new test; 

    cout << a1.a << endl;
    cout << pointer->a << " \n ";
    cout << b2->a << " \n ";

    return 0;
}

我想知道上述代码是否只创建了两个对象,即'a1'对象和指针对象'pointer'。我假设指针'b2'没有分配内存。在这种情况下,“cout << b2->a”应该会创建一个段错误。因为我正在访问未分配内存的位置。但我没有得到段错误。编译器只是打印一个随机值。
我的问题是“这里分配了三个对象还是只有两个对象”? 为什么没有发生段错误?

只有两个对象,当您进行测试*b2时; 这只是一个指针,并且将仅分配内存,就像它为32位普通指针所做的那样。 - AlexDan
2个回答

4

a1是在自动内存中分配的。

b2不是一个对象(至少不是你定义的类型的对象),而是一个指针,它没有指向有效的位置。它是一个悬空指针,对其进行解引用会导致未定义行为。任何事情都可能发生。

pointer是指向动态内存中对象的指针。它本身不是一个对象,但它指向由new test创建的对象。

这里分配了三个对象的内存还是只有两个?

只有两个。

为什么没有发生段错误?

因为未定义行为意味着任何事情都可能发生,任何行为都符合标准。


3
指针仍然是一个对象,是指针类型的对象。但我知道你的意思,以你的说法可能更容易让问题提出者理解。 - Christian Rau
1
@Luchian, @Christian - 非常感谢。我明白了,404字节(int为4字节)被分配到'a1'的自动内存中,而404字节则由'new test'在动态内存中分配,并由'pointer'指向。指针'b2'和'pointer'只在自动内存中分配32位来存储地址。如果我有误,请告诉我。 - Raghav
1
@Raghav 这是一个实现细节,可能会有所不同(sizeof(int) 不一定为 4),但是没错,就是这样。 - Luchian Grigore

1
我假设指针b2没有为其分配内存?
通常情况下,当对象被创建时,内存会自动被创建。
当指向对象的指针被创建时,始终分配NULL,以避免访问违规。
例如:
       test *b2; //not safe

       test *b2 = NULL; // SAFE

希望它有所帮助。

1
在现代C++中,您应该使用nullptr而不是NULL - Peter - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接