我正在读期末考试,我偶然发现了一个奇怪的问题,这是我们老师去年给一些可怜的灵魂所做的考试的一部分。问题是这样的:
以下程序是否正确?如果是,请记下程序输出的内容。如果不是,请写下原因。
该计划:
#include<iostream.h>
class cls
{ int x;
public: cls() { x=23; }
int get_x(){ return x; } };
int main()
{ cls *p1, *p2;
p1=new cls;
p2=(cls*)malloc(sizeof(cls));
int x=p1->get_x()+p2->get_x();
cout<<x;
return 0;
}
我的第一直觉是回答“程序不正确,因为应使用new
代替malloc
”。但是,在编译程序并看到它输出23
后,我意识到答案可能不正确。
问题在于我期望p2->get_x()
返回一些任意数字(无论在调用malloc
时发生在内存中的那个地方)。但是,它返回0.我不确定这是巧合还是类成员在malloc
编辑时被初始化为0。
p2->x
在malloc
之后为0)是否为默认值?我应该预期吗?#include <stdlib.h>
malloc
:P)答案 0 :(得分:14)
不,p2-&gt; x可以是调用malloc之后的任何内容。它恰好在您的测试环境中为0。
每个人都告诉你的是,new结合了从freestore获取内存的调用以及对对象构造函数的调用。 Malloc只做了一半。
修复它:示例程序错误。将“malloc”与类一起使用并不总是错误的。它在共享内存情况下完全有效,您只需要为新内容添加就地呼叫:
p2=(cls*)malloc(sizeof(cls));
new(p2) cls;
答案 1 :(得分:3)
新调用构造函数,malloc不会。所以你的对象将处于未知状态。
答案 2 :(得分:1)
实际行为未知,因为new
的行为与malloc
+ constructor
调用非常相似。
在你的代码中,第二部分缺失,因此,它可以在一个案例中工作,但它不能,但你不能确切地说。
答案 3 :(得分:0)
为什么0也不能成为任意数字?你在调试模式下运行吗?什么编译器?
VC ++使用一串0xCC字节值预先填充新分配的内存(当然是在调试模式下),因此如果您使用它,则不会为答案获得零。
答案 4 :(得分:0)
Malloc没有保证将其分配的内存归零,并且程序的结果未定义。
否则还有很多其他因素使得这个程序不能正确使用C ++。 cout
位于名称空间std
中,malloc
需要通过#include <cstdlib>
包含,而iostream.h也不符合标准。