gau*_*inc 0 c c++ memory-management objective-c
不久前,当我写下这样的东西时,我问自己:
char* first(int howMany){
return (char*)malloc(howMany);
}
int main(){
char*t;
int one=20;
t=first(20);
}
Run Code Online (Sandbox Code Playgroud)
这段代码在codepad.org崩溃,但在Mepis Linux 11.04中,它只是引发了一些警告.
但是,如果我为C++写这样的东西:
char* first(int howMany){
return new char [howMany];
}
int main(){
char*t;
int one=20;
t=first(20);
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常.
我的问题是:
当我尝试时,为什么C代码不能正常工作以及会发生什么
return (char*)malloc(howMany)?
PS:如果我尝试在Objective-C中使用这个函数会发生什么?
(NSArray*) first(){
return [NSArray array];
}
Run Code Online (Sandbox Code Playgroud)
我没有在codepad.org中崩溃,它运行,但程序的退出状态表示错误.退出状态是不确定的,只是发生的事情是在栈上的机会,出口值(它正好是120 codepad.org)来自于你的程序不返回从主(正常荷兰国际集团任何东西),像它应该做的.
传统上在C和C++中,您必须从main()显式返回一些东西.在后来的C和C++标准中,这已被更改,因此如果退出main()而没有return语句,它将自动返回0.(0表示成功.)
似乎已经发生的事情是你有一个尊重这个标准的C++编译器,(标准C++有这个规则比标准C更长的时间),如果main()没有返回任何东西,它默认返回0.
相反,codepad.org上的C编译器似乎遵循较旧的标准,其中main()必须具有显式的return语句,以使程序有效.因此,人们可以说,因为你的程序不能codepad.org没有一个最新的C编译器,或者人们可以说,你的程序应该是比较保守的,而不是假定一个现代的编译器,而是返回从主明确的().
这就是为什么Mepis Linux上的编译器会警告你.它可能未配置为遵循最新标准,因此警告您应该使用return语句结束main()函数.
因此,如果您想编写适用于所有地方的保守代码,则main()函数应始终以return语句结束.您的问题就是证明,如果您希望代码在"真实世界"中运行,那么依赖新标准的功能可能会很危险.
更改为Objective C可能会改变其他内容,但主要问题(双关语)仍然是您没有显式返回main()中的值以及Objective C的C部分在特定编译器中遵循的标准.
你没有释放内存,很可能会导致内存泄漏,但这不是程序本身的错误,也不会影响你观察到的问题.(实际上,在Linux上,退出程序会自动释放所有内存,这可能是编程粗略但不正确.)