簡體   English   中英

在c ++中調用“new”時出現分段錯誤?

[英]Segmentation fault when calling “new” in c++?

當我試圖調用“new”來創建一個指針並將其推入向量時,我得到了段錯誤。 我在向量中推送元素的代碼是:

queue->push_back(new Box(gen_id, Interval(x_mid, x_end), Interval(y_mid-y_halfwidth, y_mid+y_halfwidth)));

基本上Box是一個類,構造函數只需要3個參數, generation_id和2個Intervals 在此“推送”之前和之后,我在向量中打印出內容,然后:

[ -0.30908203125, -0.3087158203125 ] , [ -0.951416015625, -0.9510498046875 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.951416015625, -0.9510498046875 ]
[ -0.30908203125, -0.3087158203125 ] , [ -0.9510498046875, -0.95068359375 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.9510498046875, -0.95068359375 ]

后:

[ -0.30908203125, -0.3087158203125 ] , [ -0.951416015625, -0.9510498046875 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.951416015625, -0.9510498046875 ]
[ 8.9039208750109844342e-243, 6.7903818933216500424e-173 ] , [ -0.9510498046875, -0.95068359375 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.9510498046875, -0.95068359375 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.95123291015625, -0.95086669921875 ]

我不知道為什么會發生這種情況,但顯然,有一個元素被破壞了。 除了“推”之外,這兩組輸出之間沒有其他代碼,我使用gdb來確認。 另外,我查看了這2個Intervals變量,兩個都給了我一個有意義的結果。

我的問題是:“新”在什么情況下會出現段錯誤? 或者是因為其他東西導致我的問題? 謝謝。

假設它確實是new生成段錯誤,最常見的原因是損壞的堆,通常是覆蓋您不擁有的內存和/或雙重刪除的結果。

如果你可以在Linux系統上運行,Valgrind將成為你的朋友。

我懷疑new本身是否會給你帶來段錯誤; 問題可能出在其中一個構造函數中。 嘗試拆分那條巨線,並輸入一些打印語句,以確切了解問題所在。

printf("Creating the first interval...\n");
Interval a(x_mid, x_end);
printf("Creating the second interval...\n");
Interval b(y_mid-y_halfwidth, y_mid + y_halfwidth);
printf("Creating the box...\n");
Box* box_to_enqueue = new Box(gen_id, a, b);
printf("Enqueueing the box...\n");
// Do you really want to enqueue a pointer instead of a Box?
queue->push_back(box_to_enqueue);

暫無
暫無

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

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