簡體   English   中英

STL 位集移位運算符導致分段錯誤

[英]STL bitset shift operator causes segmentation fault

考慮以下代碼:

#include <iostream>
#include <bitset>

using namespace std;

int main() {
  const int N = 1e9;
  bitset<N> st;
  st << 999;
  cout << st.test(0);
}

(請注意,使用了運算符<< ,而不是<<= 。我需要的是<< 。也不要刪除cout行,因為那樣就不會有 SegFault。我相信這是因為編譯器優化)。

這會導致我的機器出現分段錯誤。 但是,將 999 更改為 1 后,不會引發異常。 問題是什么,拋出了什么類型的異常,如何解決?

另一個奇怪的事情是,該代碼可以在某些計算機上運行,包括 ideone 服務器。 但是,不是我的:

gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2)

那么請解釋為什么在某些計算機上無法重現該問題?

原始代碼最有可能導致堆棧溢出:位集可能使用數百兆字節的 memory,而系統通常默認使用幾兆字節的堆棧大小。

超出堆棧限制的行為可能因系統而異; 在某些情況下,它可能會按預期工作,而在其他情況下,可能會出現某種信號或崩潰或不可預測的行為。

您可以使用static bitset<N> st; ,或動態分配。 但是還有另一個問題。 該聲明:

st << 999;

調用一個重載的操作符 function ,它按值返回一個臨時的位集,所以這個臨時的位集仍然會導致堆棧溢出。

為避免這種情況,您將不必調用st << 999 你還沒有說你想用這段代碼做什么,但如果你打算就地修改位集,你可以寫st <<= 999; . 如果您打算在不更改原始位集的情況下制作更改副本,則首先制作一個副本(使用 static 或動態分配),然后在副本上調用<<= 999

暫無
暫無

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

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