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 ”应该会造成分段错误。我正在访问一个尚未分配内存的位置。但我没有得到分段错误。编译器只是打印一个随机值。

我的问题是“这里是三个对象分配内存还是只有两个”?为什么没有分段错误?

4

2 回答 2

4

a1在自动内存中分配。

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

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

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

只有两个。

为什么没有分段错误?

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

于 2012-10-21T16:02:46.747 回答
1

我假设指针b2没有为它分配内存?

  • 通常在创建对象时会自动创建内存。

  • 始终NULL在创建指向对象的指针时分配,避免访问冲突。

例子:

       test *b2; //not safe

       test *b2 = NULL; // SAFE

希望能帮助到你。

于 2019-10-28T06:49:54.070 回答