我想我的問題很愚蠢,但是:
在我的 C 代碼中,我使用了一些遺留的 C 庫(XLib)。為了使用這個庫,必須首先打開到 X 服務器的連接:
::Display* const display = ::XOpenDisplay(nullptr);
這種display結構廣泛用于絕大多數 XLib 函式,包括分配和釋放記憶體和系統資源(如字體、顏色圖等)的函式。在我的代碼中,我使用物件的建構式和解構式通過呼叫這些函式來分配和釋放資源職能。這就是問題所在:
int main()
{
::Display* const display = ::XOpenDisplay(nullptr);
// ...
Object1 object1(display, ...); // uses display inside the destructor
Object2 object2(display, ...); // uses display inside the destructor
Object3 object3(display, ...); // uses display inside the destructor
// ...
::XCloseDisplay(display); // invalidates the display structure
return 0;
}
此示例導致分段錯誤,因為在呼叫任何使用它的解構式之前,該display結構已失效。XCloseDisplay()為了避免這個問題,我可以XCloseDisplay()在花括號中包含之前的所有代碼以限制物件的范圍,但這會使代碼向右移動,看起來很丑陋。
有什么辦法可以XCloseDisplay()在之后呼叫main()嗎?
uj5u.com熱心網友回復:
這是可能的,但沒有必要。
相反,將它包裝在一個在解構式中關閉它的類中,就像你對其他物件所做的那樣。
解構式以相反的順序被呼叫,這意味著如果你先創建顯示,它會最后死掉。
類似地,您呼叫它的方式main是從全域或函式區域static物件的解構式。函式區域靜態比全域變數更好,因為它避免了靜態初始化順序慘敗。
uj5u.com熱心網友回復:
使用gcc 的屬性也可以
void __attribute__((constructor)) calledFirst();
void __attribute__((destructor)) calledLast();
void main()
{
printf("\nI am in main");
}
// This function is assigned to execute before
// main using __attribute__((constructor))
void calledFirst()
{
printf("\nI am called first");
}
// This function is assigned to execute after
// main using __attribute__((destructor))
void calledLast()
{
printf("\nI am called last");
}
測驗:https ://godbolt.org/z/vPhf36cbe
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/436698.html
