有人告诉我,分配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一系列流等.
你的朋友可能在谈论:
一般使用指针的安全性.例如,在C++中如果要使用malloc分配char数组,请问为什么不使用stringor或vector.指针不是不安全的,但由于错误使用指针而导致错误的代码是.
特别是关于malloc的东西.出于安全原因,大多数操作系统在首次将内存交给进程之前清除内存.否则,来自一个应用程序的敏感数据可能泄露给另一个应用程序.在没有这样做的操作系统上,你可能会认为存在与之相关的不安全因素malloc.它真的更相关free.
你的朋友也可能不知道他在说什么.当有人说"X不安全"时,我的回答是"以什么方式?".