#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”应该会产生分段错误。我正在访问未分配内存的位置。但我没有遇到细分错误。编译器只打印一个随机值。
我的问题是“在这里三个对象分配了内存还是只有两个”?为什么没有分割错误?
[a1
被分配到自动存储器中。
b2
不是一个对象(不是您定义的类型的对象),而是一个指针,并且它不指向有效位置。它是一个悬空指针,对其取消引用会导致undefined behavior。可能发生任何事情。
pointer
是指向动态内存中对象的指针。它本身不是对象,但指向new test
创建的对象。
这里是三个对象分配了内存还是只有两个
仅两个。
为什么没有分段错误?
因为未定义的行为表示会发生任何事情。任何行为都是符合标准的。
我假设指针'b2'没有为其分配内存?
通常在创建对象时会自动创建内存。
[创建指向对象的指针时始终分配NULL,避免访问冲突。
示例:
test *b2; //not safe
test *b2 = NULL; // SAFE