C/C++/ObjectiveC之间的内存差异,程序在 codepad.org 崩溃,但在Linux上不会崩溃
Memory difference between C/C++/ObjectiveC, program crashes on codepad.org but not on Linux
不久前,当我写这样的东西时,我问自己:
char* first(int howMany){
return (char*)malloc(howMany);
}
int main(){
char*t;
int one=20;
t=first(20);
}
这段代码在 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);
}
此代码工作正常。
我的问题是:
为什么 C 代码不起作用以及当我尝试
return (char*)malloc(howMany)
?
PS:如果我尝试在Objective-C中使用这个函数会发生什么?
(NSArray*) first(){
return [NSArray array];
}
我没有崩溃 codepad.org,它会运行,但程序的退出状态指示错误。退出状态是未定义的,只是碰巧在堆栈上碰巧是什么,退出值(codepad.org 上恰好是 120)来自您的程序没有像它应该的那样从 main() 正确返回任何内容。
传统上,在 C 和 C++ 中,您必须显式地从 main() 返回一些东西。在后来的 C 和 C++ 标准中,这被更改了,因此如果你在没有 return 语句的情况下退出 main(),它会自动返回 0。(0 表示成功。
似乎已经发生的事情是,你有一个C++编译器,它尊重这个标准,(标准C++比标准C有这个规则的时间更长),如果main()没有返回任何东西,它默认返回0。
相比之下,codepad.org 上的 C 编译器似乎遵循较旧的标准,其中 main() 必须具有显式返回语句才能使程序有效。因此,有人可能会争辩说你的程序失败是因为 codepad.org 没有最新的 C 编译器,或者有人可能会争辩说你的程序应该更保守,而不是假设现代编译器,而是从 main() 显式返回。
这就是为什么Mepis Linux上的编译器会警告你。它可能没有配置为遵循最新标准,因此警告您应该使用 return 语句结束 main() 函数。
因此,如果你想编写可以在任何地方工作的保守代码,你的main()函数应该总是以return语句结尾。你的问题证明,如果你想让你的代码在"现实世界"中工作,依赖新标准的功能可能是危险的。
更改为目标 C 可能会更改其他内容,但主要问题(双关语)仍然是您没有明确地从 main() 返回值,以及目标 C 的 C 部分在特定编译器中遵循什么标准。
您没有释放内存,可能会导致内存泄漏,但不是程序本身的错误,并且不会影响您观察到的问题。(事实上,在Linux上,退出程序会自动释放所有内存,这可能是草率的编程,但不是不正确的。
C
和 C++
的一个重要区别是,在 C++
中,如果没有显式返回,main
函数返回0
。代码示例中就是这种情况,因此无论是否存在任何代码错误,它都被视为在C++中成功退出。
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- C/C++/ObjectiveC之间的内存差异,程序在 codepad.org 崩溃,但在Linux上不会崩溃