有人告诉我,使用malloc进行内存分配不再安全,虽然我不是C/C++专家,但是我已经用malloc和C/C++做了一些东西。有没有人知道我可能遇到的风险是什么?
引用他的话:
[...]但事实上,C/C++的弱点就是安全性,而致命的是malloc和滥用指针。C/C++是公认的不安全语言。[...]除了少数应用程序外,我不建议继续使用C++编程。"
new
比malloc()
更加安全,但这并不意味着malloc()
比以前更加不安全。你的朋友有没有说为什么他认为它不安全?
1) 在使用C++时,当您在同一程序中同时使用malloc()
/free()
和new
/delete
时,您需要小心。虽然这是可能且允许的,但是用malloc()
分配的所有内容必须使用free()
释放,而不能使用delete
。同样,用new
分配的所有内容都必须使用delete
释放,而不能使用free()
。(这个逻辑进一步扩展:如果您使用new[]
分配数组,则必须使用delete[]
释放,而不能只用delete
。)请始终使用相应的对应对象进行分配和释放。
int* ni = new int;
free(ni); // ERROR: don't do this!
delete ni; // OK
int* mi = (int*)malloc(sizeof(int));
delete mi; // ERROR!
free(mi); // OK
2) malloc()
和 new
(再谈C++)并不完全相同。 malloc()
只是给你一块可用的内存;如果可用,new
会额外调用构造函数。同样地,delete
会调用析构函数(如果有),但是 free()
则不会。这可能导致问题,例如对象未正确初始化(因为未调用构造函数)或未释放资源(因为未调用析构函数)。
3) C ++ 的 new
还负责为指定类型分配正确数量的内存,而你需要使用 malloc()
自行计算:
int *ni = new int;
int *mi = (int*)malloc(sizeof(int)); // required amount of memory must be
// explicitly specified!
// (in some situations, you can make this
// a little safer against code changes by
// writing sizeof(*mi) instead.)
在 C++ 中,尽可能使用 new
/delete
,而不是 malloc()
/free()
。(在 C 中,new
/delete
不可用,因此选择显然。)
new
,只要其行为符合标准即可。换句话说,malloc
很可能会被调用以实现new
的分配部分行为。 - Dustinnew
分配的内容。您提到的是特定于实现的,因此没有任何保证;它不应影响您编写代码的方式。 - stakx - no longer contributing使用指针的安全性。例如,在C++中,如果您正在使用malloc分配char数组,请考虑为什么不使用string
或vector
。指针本身并不是不安全的,但由于指针的错误使用而导致代码出现漏洞是不安全的。
关于malloc的某些问题。大多数操作系统在将内存首次交给进程之前会清除内存,以保护安全。否则,一个应用程序中的敏感数据可能会泄露到另一个应用程序中。在不这样做的操作系统上,可以认为与malloc
相关的不安全性实际上更与free
有关。
您的朋友也可能不知道他在说什么。当有人说“X不安全”时,我的回答是:“在哪方面不安全?”。
这是C语言中本地分配和释放内存的唯一方式。如果使用不当,它可能会像其他任何东西一样不安全。微软提供了一些“安全”的其他函数版本,它们需要一个额外的size_t参数 - 也许您的朋友指的是类似的内容?如果是这种情况,他可能只是更喜欢calloc()而不是malloc()。
LocalAlloc
、HeapAlloc
、GlobalAlloc
等特定的API来进行内存分配。这些都是本地的。 - jweyrichmalloc
来分配内存。当然,您的朋友说得没错,在C语言中编写安全代码尤其在分配内存和处理缓冲区时比较困难。但是我们都知道这一点,对吧? :)malloc
不安全就像说“不要使用X系统因为它不安全”。malloc
,在C++中使用new
。如果你在C++中使用malloc
,人们会看着你发疯,但在某些特定情况下这是可以接受的。malloc本身并没有问题。你的朋友显然是指手动内存管理不安全且容易导致错误。与其他语言自动由垃圾收集器管理内存相比(并非不可能出现泄漏—现在没人关心程序在终止时是否清理,重要的是在程序运行时有东西占用内存),手动内存管理会更具风险。
当然,在C ++中您几乎根本不需要使用malloc(因为它根本不等同于new,并且通常假设您不只想获得原始内存)。此外,完全可以使用技巧编写程序,几乎可以彻底消除内存泄漏和破坏的可能性(RAII),但这需要专业知识。
malloc
函数。你可以参考这个链接:http://www.icce.rug.nl/documents/cplusplus/cplusplus08.html#l128 - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ malloc
从一开始就不是安全的,但是除此之外,我唯一能想到的就是臭名昭著的“OOM killer”(OOM = out-of-memory),它是Linux内核使用的。 如果您愿意,可以阅读相关文档了解更多信息。 除此之外,我不认为 malloc
本身存在固有的不安全性。malloc
函数实现是不安全的,就意味着所有以相同方式运作的先前实现也是不安全的。换句话说,如果现在的malloc
不安全,那么它从来就不安全。至于为什么它不安全,我真的不知道。我只是给予OP怀疑的余地。 :P - Dustin
new
和delete
而不是malloc
和free
。 - knittl