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

时间:2012-10-21 15:56:40

标签: c++ object memory pointers allocation

#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;
}

我想知道上面的代码是否只创建了两个对象,对于&#39; a1&#39;对象和指针&#39;对象指针。我假设指针&#39; b2&#39;不会为它分配内存。在那种情况下,最后一个&#34; cout&lt;&lt; b2-&gt; a&#34;这应该创建一个分段错误。我正在访问一个我没有分配内存的位置。但我没有得到分段错误。编译器justs打印一个随机值。

我的问题是&#34;三个对象是在这里分配内存还是只有两个&#34; ? 为什么没有分段错误?

2 个答案:

答案 0 :(得分:4)

a1分配在自动内存中。

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

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

  

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

只有两个。

  

为什么没有分段错误?

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

答案 1 :(得分:1)

我假设指针b2没有获得分配的内存?

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

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

示例:

       test *b2; //not safe

       test *b2 = NULL; // SAFE

希望有帮助。