sof*_*ver 2 c++ dynamic-allocation
在智能指针(能够获得动态区域中的资源所有权并在使用后释放它们)出现之前,我想知道当作为参数传递给占用资源指针的函数时,动态创建的对象的簿记是如何执行的.
通过簿记,我的意思是,如果有一个"新",那么稍后在它之后应该有一个"删除".否则,程序将遭受内存泄漏.
这是一个例子,B是一个类,void a_function(B*)是第三方库函数:
void main() {
B* b = new B(); // line1
a_function(b); // line2
??? // line3
}
Run Code Online (Sandbox Code Playgroud)
我在第3行做什么?我是否认为第三方功能已经解除了内存的分配?如果没有,我认为它有,那么我的程序会遇到内存泄漏.但是,如果它取消分配b占用的内存而且我也在main()中执行它以便安全,那么b实际上最终会被释放两次!由于双重免费错误,我的程序会崩溃!
启用"智能指针"的两个核心语言功能,更一般地说,范围限制资源管理的惯用语(SBRM,有时也称为RAII,用于"资源获取是初始化"),是:
析构函数(自动gotos)
无约束变量(每个对象都可以作为变量出现)
这些都是C++的基本核心功能,并且一直是语言的一部分.因此,智能指针在C++中一直是无法实现的.
[顺便提及,这两个功能意味着goto是必要用C来处理在系统的,一般时尚资源分配和多个出口,而它们基本上禁止在C++中.C++吸收goto了核心语言.]
与任何语言一样,人们需要很长时间才能学习,理解和采用"正确"的习语.特别是考虑到C++与C的历史联系,许多正在和正在从事C++项目的程序员都来自C背景,并且可能会发现使用熟悉的模式更加舒适,这些模式仍然受到C++的支持,即使这些模式仍然是不建议("只需更换malloc与new每个人,我们会准备好船").