我正在通过以下代码:
#include <iostream>
using namespace std;
class B
{
public:
int a;
void display()
{
a=10;
cout<<"Content of base class.\n"; }
};
int main()
{
B *b,b1,b2;
char *a=new char[1];
*a='A';
if(b==NULL)
{
cout<<(*(int*)a)<<endl;
}
b->display();
b1.display();
b2.display();
b->a=60;
b1.a=40;
b2.a=50;
cout<<b->a<<endl<<b1.a<<endl<<b2.a;
return 0;
}
它提供以下输出:
65
Content of base class.
Content of base class.
Content of base class.
60
40
50
根据我的知识,每个创建的对象都会分配一些空间,并且该对象的数据存储在那里(这里是b1和b2)。但是在这段代码中,b只是一个指针,它仍然可以访问函数和变量B类,它甚至没有指出任何类Bb的对象是NULL,如if语句所示。我对此感到困惑!!!
现在我还想知道b-&gt; a(其值为60)的存储位置?如b1和b2中的40和50就好。
另外,如果只有指针足以调用函数,那么每次都需要创建对象吗?
答案 0 :(得分:3)
未定义的行为。你收到的输出,以及程序没有崩溃的事实,只不过是巧合。
如果您不需要对象,请使用静态或独立功能。
答案 1 :(得分:2)
b->display();
会产生未定义的行为。这意味着,无论你的计算机在那一刻做什么都足够了。
存储b->a
的位置的问题毫无意义,因为访问b->a
会产生未定义的行为。
在某些情况下,C ++没有义务告诉你,你搞砸了。取消引用指向未初始化内存的指针就是这种情况。
答案 2 :(得分:0)
考虑到你在那里运行你所拥有的东西:(统一差异:http://hastebin.com/midocuqiki),你会得到:
$ ./b
Segmentation fault (core dumped)
实际上,当你编译时:
$ g++ -Wall B.cpp -o b
B.cpp: In function ‘int main()’:
B.cpp:11:5: warning: ‘b’ may be used uninitialized in this function [-Wmaybe-uninitialized]
if(b==NULL)
^
未定义的行为。你得到了那个输出,因为Visual Studio (以及我认为你使用的那个),正在优化使用你之前的堆栈,并且你会在你真正有东西的内存中找到相同的位置。
但是完全错了!
和是, &#34;每次创建对象都非常必要&#34; !
更新:@codecracker表示此行为也在gcc
上! (怪异)