簡體   English   中英

c ++中的分段錯誤(核心轉儲)無法找到錯誤

[英]Segmentation fault (core dumped) in c++ Can't find error

我似乎無法找到錯誤的來源。 該代碼定義了一個名為boolfunc的結構。 我定義了一個函數來添加兩個boolfunc(s)。 我得到錯誤:分段錯誤(核心轉儲)。 我知道這意味着什么,但錯誤的來源在哪里。

#include<iostream>
#include<vector>
using namespace std;

class boolfunc {
public:
  int num_var;
  int num_terms;
  vector<vector<int> > func;
  boolfunc addfunc(boolfunc f1, boolfunc f2);
};

boolfunc addfunc(boolfunc f1, boolfunc f2)
  {
    boolfunc f3;
    f3.func.resize(0);
    f3.num_terms = f1.num_terms + f2.num_terms;
    int var_dif = f1.num_var - f2.num_var;
    if(var_dif >= 0)
        {
        f3.num_var=f1.num_var;
        f3.func.resize(f1.num_var);
        f2.num_var=f1.num_var;
            f2.func.resize(f1.num_var);
        for(int i=0; i<f2.num_terms; ++i)
            {
            for(int j=0; j<var_dif; ++j)
                {
                f2.func[i].push_back(-1);
                }
            }
        }
    else
        {
        f3.num_var=f2.num_var;
        f3.func.resize(f2.num_var);
        f1.num_var=f2.num_var;
        f1.func.resize(f2.num_var);
        for(int i=0; i<f1.num_terms; ++i)
            {
            for(int j=0; j<(-1)*(var_dif); ++j)
                {
                f1.func[i].push_back(-1);
                }
            }
        }
    for(int i=0; i<f1.num_terms; ++i)
        {
        f3.func[i]=f1.func[i];
        }   
    for(int j=0; j<f2.num_terms;++j)
        {
        f3.func[j+f1.num_terms]=f2.func[j];
        }
    return f3;
    }

int main()
{
boolfunc ef1, ef2, ef3;
ef1.func.resize(0);
ef2.func.resize(0);
ef3.func.resize(0);
cout<< "Input the number of variables of function 1" <<endl;
cin>> ef1.num_var;
cout<< "Input the number of variables of function 2" <<endl;
cin>> ef2.num_var;
cout<< "Input the number of terms of function 1" <<endl;
cin>> ef1.num_terms;
cout<< "Input the number of terms of function 2" <<endl;
cin>> ef2.num_terms;
ef1.func.resize(ef1.num_terms);
  for(int i=0; i<ef1.num_terms; ++i)
    {
    ef1.func[i].resize(ef1.num_var);
    for(int j=0; j<ef1.num_var; ++j)
        {
    cout<<"For function 1, Input the term "<<i+1<<"'s variable "<<j+1<<"'s     value:";
        cin>>ef1.func[i][j];
        }
    }
ef2.func.resize(ef2.num_terms);
  for(int i=0; i<ef2.num_terms; ++i)
    {
    ef2.func[i].resize(ef2.num_var);
    for(int j=0; j<ef2.num_var; ++j)
        {
    cout<<"For function 2, Input the term "<<i+1<<"'s variable "<<j+1<<"'s     value:";
        cin>>ef2.func[i][j];
        }
    }
ef3 = addfunc(ef1, ef2);
for(int i=0; i<ef3.num_terms; ++i)
    {
    for(int j=0; j<ef3.num_var; ++j)
        {
        cout<<ef3.func[i][j]<<' ';
        if(j==ef3.num_var -1) cout<<endl;
        }
    }
return 0;
}

如何處理:

建立並運行

g++ -Wall -Wextra -O0 -ggdb main.cpp
gdb --args ./a.out

使用示例向量(0,0,1,0),您的程序在第49行失敗:

f3.func[i]=f1.func[i];

有錯誤:

Input the number of variables of function 1
0
Input the number of variables of function 2
0
Input the number of terms of function 1
1
Input the number of terms of function 2
0

Program received signal SIGSEGV, Segmentation fault.
0x0000000000402930 in std::vector<int, std::allocator<int> >::capacity (this=0x0) at /usr/include/c++/4.6/bits/stl_vector.h:652
652              - this->_M_impl._M_start); }
(gdb) bt
#0  0x0000000000402930 in std::vector<int, std::allocator<int> >::capacity (this=0x0) at /usr/include/c++/4.6/bits/stl_vector.h:652
#1  0x0000000000401bf3 in std::vector<int, std::allocator<int> >::operator= (this=0x0, __x=...) at /usr/include/c++/4.6/bits/vector.tcc:164
#2  0x0000000000400fc3 in addfunc (f1=..., f2=...) at main.cpp:49
#3  0x0000000000401558 in main () at main.cpp:92

分析

如果查看程序結束的邊界並啟動標准庫,我們會立即看到錯誤:

std::vector<int, std::allocator<int> >::operator= (this=0x0, __x=...) at /usr/include/c++/4.6/bits/vector.tcc:164

如您所見, NULL作為this參數傳遞給std::vector<..>::operator= ,這意味着您的f3.func向量的大小錯誤。

最簡單的一個:使用valgrind。

像這樣: http//codepad.org/uSfdSK5d

更好的問題形式可能提供了更詳細的答案。

暫無
暫無

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

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