簡體   English   中英

在析構函數中持有std :: lock_guard是否安全?

[英]Is it safe to hold a std::lock_guard in the destructor?

我正在嘗試確定以下代碼是否安全,或者它是否為UB並且在這種情況下恰好運行良好(在此處運行):

#include <iostream>
#include <mutex>

struct Foo
{
  std::mutex mutex;
  ~Foo()
  {
    std::lock_guard<std::mutex> lock(mutex);
  }
};

int main() 
{
  {
    Foo foo;
  }
  std::cout << "everything seems to work fine...?" << std::endl;
}

具體來說,在成員變量出現之前,我們是否可以保證在析構函數中定義的局部變量被破壞?

我在cppreference.com上找到了以下內容,但它似乎沒有完全回答我的問題:

破壞序列

對於用戶定義或隱式定義的析構函數,在執行析構函數體之后,編譯器按照聲明的相反順序調用類的所有非靜態非變體成員的析構函數,然后調用析構函數所有直接的非虛基類按照構造的相反順序(反過來調用它們的成員及其基類的析構函數等),然后,如果這個對象是派生最多的類,它調用所有虛擬的析構函數基地。

根據[class.dtor] / 9中的標准,

在執行析構函數的主體並銷毀在主體內分配的任何自動對象之后,類X的析構函數調用X的直接非變量非靜態數據成員的析構函數, X的非虛擬直接庫的析構函數如果X是派生類最多的類(15.6.2),它的析構函數會調用X的虛擬基類的析構函數。 ...

這肯定地回答了你的問題。

析構函數的主體在任何成員被破壞之前執行。 從這個意義上說它是安全的。

但在問題是否安全之前,必須先詢問是否有任何合理的用例來保存析構函數(以及構造函數)中的互斥鎖。

只有一個線程可以構造或破壞對象。 這必須通過對象外部的互斥鎖來保證,例如在工廠中的構造或共享指針中的破壞。

暫無
暫無

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

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