智能指针诞生之前

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实际上最终会被释放两次!由于双重免费错误,我的程序会崩溃!

Ker*_* SB 5

启用"智能指针"的两个核心语言功能,更一般地说,范围限制资源管理的惯用语(SBRM,有时也称为RAII,用于"资源获取是初始化"),是:

  • 析构函数(自动gotos)

  • 无约束变量(每个对象都可以作为变量出现)

这些都是C++的基本核心功能,并且一直是语言的一部分.因此,智能指针在C++中一直是无法实现的.

[顺便提及,这两个功能意味着goto必要用C来处理在系统的,一般时尚资源分配和多个出口,而它们基本上禁止在C++中.C++吸收goto了核心语言.]

与任何语言一样,人们需要很长时间才能学习,理解和采用"正确"的习语.特别是考虑到C++与C的历史联系,许多正在和正在从事C++项目的程序员都来自C背景,并且可能会发现使用熟悉的模式更加舒适,这些模式仍然受到C++的支持,即使这些模式仍然是不建议("只需更换mallocnew每个人,我们会准备好船").

  • 我总是讨厌整个"按照你自己的步伐行动",这是双重说法"如果你不知道如何使用它,做你一直做的事情." 因为面对为什么新的替代品首先被认识到的原因而感到憎恨.您有一种具有这些功能的语言.采取ASAP并撕掉绷带.它会伤害一分钟,但你以后会感觉好多了. (2认同)
  • @Kerrek:在C语言的实践中,我系统地使用`goto`来做两件事:清理代码和做类似意大利面条的状态机而没有厌倦的"事件循环",这对代码的可理解性没有任何帮助.正如你所说,在C++中不需要以前的使用.后者的使用是罕见的,因为*I*设计的状态机是优雅结构,清晰度和可理解性的绝对模型;-)偶尔你有一个真实的情况,真正的模型是通过围绕一堆块围绕其中一个块他们通过返回来暂停状态机. (2认同)