簡體   English   中英

銷毀本地靜態對象

[英]Destruction of local static objects

考慮這樣的情況:

#include <iostream>

int foo() {
    static struct S {
        int value;
        S(int a): value(a) {}~S() {
            std::cout << "End is nigh";
        }
    }
    s(42);
    return s.value;
}

int main() {
    return foo();
}

在編譯器的實現中,我在通過_atexit調用設置S::~S()代碼中研究了這些結果,即本地靜態對象將在main()退出后的某個時刻停止存在。

如果全局靜態/外部作用域中對象的析構函數調用具有函數局部靜態作用域的函數,根據定義,該函數在第一次執行進入此作用域時被構造,而析構函數的調用是第一次? 這也可能是對象函數局部靜態作用域的析構函數在函數局部靜態作用域中構造另一個對象的情況。

這可能是一個代碼庫的情況,它依賴於 Scott Meyers 的單例實現的多個實例,其中對象實例是函數局部靜態變量。 如果這樣的單例必須在執行的這個階段訪問標准流,我不確定會發生什么,是否確定它們在atexit處理程序之后停止運行。

這是一個已知解決方案的已知問題,不幸的是它相當復雜。 我所知道的最好的方法是 Modern C++ Design 中的Phoenix Singleton 簡而言之,你可以依靠非類單例的值,並且可以重用s的內存在同一位置重新創建一個S對象。

另一種方法是用剩余單例共同擁有的對象替換一些實用程序單例,即通過shared_ptr 這將在最后一個單例超出范圍后被刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM