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

Fel*_*lix 8 c++ malloc memory-management

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

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

该程序:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我的第一直觉是回答"程序不正确,new应该用来代替malloc".但是,在编译程序并查看输出后,23我意识到答案可能不正确.

问题是我期望p2->get_x()返回一些任意数字(无论发生什么事情都在malloc被调用的内存中).然而,它返回0.我不确定这是巧合还是类成员在malloc-ed 时被初始化为0 .

  • 这种行为(p2->x在0之后malloc)是默认的吗?我应该预料到这一点吗?
  • 什么会你的答案,我的老师的问题是什么?(除了忘记#include <stdlib.h>malloc:P)

jmu*_*llo 14

  • 这种行为(在malloc之后p2-> x为0)是默认的吗?我应该预料到这一点吗?

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

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

每个人都告诉你的是,new结合了从freestore获取内存的调用以及对对象构造函数的调用.Malloc只做了一半.

修复它:虽然示例程序是错误的.将"malloc"与类一起使用并不总是错误的.它在共享内存情况下完全有效,您只需要为new添加就地调用:

p2=(cls*)malloc(sizeof(cls));
new(p2) cls;
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在使用placement new,则还必须显式调用析构函数(您不能使用delete,因为您没有使用new).另外你应该知道这不常见(当你为多个项目(不仅仅是一个)预先分配存储时,在构建自己的容器时使用的mainley) (2认同)