#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; ? 为什么没有分段错误?
答案 0 :(得分:4)
a1
分配在自动内存中。
b2
不是对象(嗯,不是您定义的类型的对象),而是指针,并且它不指向有效位置。它是一个悬空指针,取消引用会导致未定义的行为。任何事情都可能发生。
pointer
是指向动态内存中对象的指针。它本身不是一个对象,但它指向由new test
创建的对象。
三个对象是在这里分配内存还是只分配了两个
只有两个。
为什么没有分段错误?
因为未定义的行为意味着任何事情都可能发生。任何行为都符合标准。
答案 1 :(得分:1)
我假设指针b2
没有获得分配的内存?
通常在创建对象时会自动创建内存。
在创建指向对象的指针时始终分配NULL
,避免访问冲突。
示例:
test *b2; //not safe
test *b2 = NULL; // SAFE
希望有帮助。