当使用malloc而不是new时,类成员会发生什么?

时间:2010-05-26 15:11:17

标签: c++ memory-management malloc

我正在读期末考试,我偶然发现了一个奇怪的问题,这是我们老师去年给一些可怜的灵魂所做的考试的一部分。问题是这样的:

  

以下程序是否正确?如果是,请记下程序输出的内容。如果不是,请写下原因。

该计划:

#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->xmalloc之后为0)是否为默认值?我应该预期吗?
  • 你的回答老师的问题是什么? (除了忘记#include <stdlib.h> malloc:P)

5 个答案:

答案 0 :(得分:14)

  • 这种行为(在malloc之后p2-> x为0)是默认的吗?我应该期待这个吗?

不,p2-&gt; x可以是调用malloc之后的任何内容。它恰好在您的测试环境中为0。

  • 你对老师问题的回答是什么? (除了忘记#include for malloc:P)

每个人都告诉你的是,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也不符合标准。