为什么资源管理秩序很重要? 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
};
并不是说这个例子看起来像一个好的设计,但你永远不会知道。有时成员之间存在某种依赖关系是有原因的