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
不,p2-> x可以是调用malloc之后的任何内容.它恰好在您的测试环境中为0.
每个人都告诉你的是,new结合了从freestore获取内存的调用以及对对象构造函数的调用.Malloc只做了一半.
修复它:虽然示例程序是错误的.将"malloc"与类一起使用并不总是错误的.它在共享内存情况下完全有效,您只需要为new添加就地调用:
p2=(cls*)malloc(sizeof(cls));
new(p2) cls;
Run Code Online (Sandbox Code Playgroud)