为什么资源管理秩序很重要? Stroustrup在《C++编程语言》一书中提到:“资源的释放顺序与资源的释放顺序一般是很重要的”。 为什么订单很重要 void acquire() { acquire resource 1; ... acquire resource n; use resources; release resource n; ... release resource 1; }

为什么资源管理秩序很重要? Stroustrup在《C++编程语言》一书中提到:“资源的释放顺序与资源的释放顺序一般是很重要的”。 为什么订单很重要 void acquire() { acquire resource 1; ... acquire resource n; use resources; release resource n; ... release resource 1; },c++,C++,那么,如果我们改变顺序如下 void acquire() { acquire resource 1; ... acquire resource n; use resources; release resource 1; ... release resource n; } 在现实世界的代码中,资源通常是嵌套的,您希望在构建对象时任何可用的东西在销毁对象时都可用。由于C++具有确定性破坏,它必须选择一些排序,FILO(“先入,最后出”)工作得很好。 嵌

那么,如果我们改变顺序如下

void acquire()
{
   acquire resource 1;
    ...
   acquire resource n;
   use resources;
   release resource 1;
    ...
   release resource n;
}

在现实世界的代码中,资源通常是嵌套的,您希望在构建对象时任何可用的东西在销毁对象时都可用。由于C++具有确定性破坏,它必须选择一些排序,FILO(“先入,最后出”)工作得很好。 嵌套的最简单示例是类。它们总是先构造基,然后构造成员,然后构造导出的向量体:

struct Base {
  Base() { cout << "Base\n"; }
};
struct Member {
  Member() { cout << "Member\n"; }
};

struct Derived : Base {
  Member member;
  Derived() { cout << "Derived\n"; }
};
struct Base{

Base(){cout如果你不这样做,你可能会陷入死锁或泄漏的情况。比如说你声明了Obj1,它分配了Obj2-Obj3。你必须先释放2和3,然后才能释放1。但在实践中,这并不需要担心,因为构造函数和析构函数会以正确的顺序被调用。

一个原因是你通常有嵌套重新分配内存分配

E.g. you have a class 
class A{
  FILE *fp;
  char *name;
  xxx;
}

首先使用
新的A
为A分配资源,然后需要操作A的
fp
name
。因此,当您释放资源时,首先需要释放
fp
name
,然后从最一般的意义上说,
A
,“只有当它重要时才重要。”依赖性决定了必要的销毁顺序

class A {
    A( std::string *link2str );
    ~A();
    std::string *important_state;
};

class B {
    string first; // initialization occurs in the order of declaration
    A second;
    B() : first(), second( &first ) { } // not the constructor's list order
};
这里现有的答案与以相反的拓扑顺序释放嵌套资源有关

<>也可以,C++定义了一个对象内的资源被初始化的顺序。这意味着成员构造可以使用先前初始化的“兄弟姐妹”……意思是它们有依赖关系,而这些兄弟姐妹在销毁时仍然是有效的。
class A {
    A( std::string *link2str );
    ~A();
    std::string *important_state;
};

class B {
    string first; // initialization occurs in the order of declaration
    A second;
    B() : first(), second( &first ) { } // not the constructor's list order
};
并不是说这个例子看起来像一个好的设计,但你永远不会知道。有时成员之间存在某种依赖关系是有原因的