C/C++/ObjectiveC之间的内存差异,程序在codepad.org上崩溃但在Linux上没有

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)

Pro*_*ica 8

我没有在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上,退出程序会自动释放所有内存,这可能是编程粗略但不正确.)

  • 用于C的编译器标志代码板用于`-O -fmessage-length = 0 -fno-merge-constants -fstrict-aliasing -fstack-protector-all`并且假定它是gcc 4.1.2,它可能默认为使用GNU的C89扩展. (2认同)