使用malloc是否安全?

Fel*_*lix 8 c c++ malloc

有人告诉我,分配malloc不再安全了,我不是C/C++大师,但我用malloc和C/C++做了一些东西.有谁知道我有什么风险?

引用他:

[..]但事实上,C/C++的弱点在于它的安全性,而阿喀琉斯的脚跟确实是malloc和滥用指针.C/C++它是一种众所周知的不安全语言.[..]我不建议继续用C++编程的应用程序很少."

sta*_*ica 16

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  
Run Code Online (Sandbox Code Playgroud)

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.)
Run Code Online (Sandbox Code Playgroud)

结论:

在C++中,new/ delete应该优先于malloc()/ free()尽可能.(在C中,new/ delete不可用,所以那里的选择很明显.)


sbi*_*sbi 13

[...] C/C++它是一种众所周知的不安全语言.[...]

实际上,那是错的.实际上,"C/C++"甚至不存在.C,还有C++.它们共享一些(或者,如果你想要的话)很多语法,但它们确实是非常不同的语言.

他们的不同之处在于他们管理动态内存的方式.C方式确实在使用malloc()/ free()并且如果你需要动态内存,那么除了使用它们(或者几个兄弟malloc())之外你几乎没有别的东西可以使用它们.
C++的方法是不给 (手动地) 处理动态资源(其中存储器仅仅是一个)在所有.资源管理交给一些实施良好且经过测试的类,最好是从标准库中,然后自动完成.例如,不是手动处理零终止字符缓冲区,std::string而是手动处理动态分配的数组std:vector,而不是手动处理打开文件,而是有std::fstream一系列流等.

  • +1"C/C++不存在".这是我的一个主要诱惑. (3认同)

Ste*_*sop 8

你的朋友可能在谈论:

  • 一般使用指针的安全性.例如,在C++中如果要使用malloc分配char数组,请问为什么不使用stringor或vector.指针不是不安全的,但由于错误使用指针而导致错误的代码是.

  • 特别是关于malloc的东西.出于安全原因,大多数操作系统在首次将内存交给进程之前清除内存.否则,来自一个应用程序的敏感数据可能泄露给另一个应用程序.在没有这样做的操作系统上,你可能会认为存在与之相关的不安全因素malloc.它真的更相关free.

你的朋友也可能不知道他在说什么.当有人说"X不安全"时,我的回答是"以什么方式?".