代码之家  ›  专栏  ›  技术社区  ›  Felix

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

  •  8
  • Felix  · 技术社区  · 15 年前

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

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

    程序:

    #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() 返回某个任意的数字(当 马洛克 被称为。但是,它返回0。我不确定这是巧合还是类成员在初始化时用0初始化 马洛克 -ED。

    • 这是行为吗( p2->x 0后 马洛克 默认值?我应该拥有 预期 这个?
    • 什么会 你的 我老师的问题的答案是?(除了忘了 #include <stdlib.h> 对于 马洛克 P)
    5 回复  |  直到 12 年前
        1
  •  14
  •   jmucchiello    15 年前
    • 此行为(p2->x在malloc之后为0)是默认行为吗?我应该预料到这一点吗?

    不,p2->x在呼叫malloc后可以是任何内容。在您的测试环境中,它恰好是0。

    • 你对我老师的问题的回答是什么?(除了忘记包括malloc:p)

    正如所有人告诉你的,new将从freestore获取内存的调用与对对象构造函数的调用结合起来。马尔洛只做了一半。

    修正:当样本程序出错时。在类中使用“malloc”并不总是错误的。在共享内存的情况下,它是完全有效的,您只需向new添加就地调用:

    p2=(cls*)malloc(sizeof(cls));
    new(p2) cls;
    
        2
  •  3
  •   Gregor Brandt    15 年前

    new调用构造函数,malloc将不调用。所以您的对象将处于未知状态。

        3
  •  1
  •   M. Williams    15 年前

    实际的行为是未知的,因为 new 表现得很像 malloc + constructor 打电话。

    在您的代码中,第二部分丢失了,因此,它可能在一种情况下工作,但它不能工作,但您不能确切地说。

        4
  •  0
  •   Sandeep Datta    15 年前

    为什么0不能也是一个任意数?是否在调试模式下运行?什么编译器?

    vc++用一个由0xcc字节值组成的字符串(当然是在调试模式下)预先填充新分配的内存,这样,如果使用该字符串,您就不会得到答案的零。

        5
  •  0
  •   pmr    15 年前

    malloc不保证将分配的内存清零,并且程序的结果未定义。

    否则,还有许多其他的东西,使这个程序不正确的C++。 cout 在命名空间中 std , malloc 需要通过 #include <cstdlib> 而iostream.h也不符合标准。