2013-04-01 106 views
2

在CodeBlocks中对此进行编码,该程序不断收到seg故障。谁能帮忙?程序不断收到分段错误

#include <string> 
#include <iostream> 
#include <sstream> 
#include "include/hugeint.h" 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    HugeInt h("123"); 

    return 0; 
} 

我HugeInt类(什么相关),存储非常大的整数作为整数

class HugeInt 
{ 
public: 
    HugeInt(string); 
private: 
    DynArray dyn; 
    //HugeInt& reverse(); 
    int size; 
}; 

HugeInt::HugeInt(string input) 
{ 
    string digits = input; 

    for(unsigned int i = 0; i < digits.length(); i++){ 
     dyn.add(digits.at(i) - 48); 
    } 
    size = dyn.size(); 
} 

我的动态数组类整数

class DynArray 
{ 
public: 
    DynArray(); 
    ~DynArray(); 
private: 
    int length; 
    int *arr; //points to this array 
    int nextIndex; 
}; 

DynArray::DynArray() { 
    arr = new int[10]; 
    for (int i = 0; i < 10; i++) 
     arr[i] = 0; 
    length = 10; 
    nextIndex = 0; } 

DynArray::~DynArray() 
{ 
    delete [] arr; 
} 

int DynArray::size(){ 
    return nextIndex; 
} 

void DynArray::add(int val) { 
    int *newArr; 
    if (nextIndex == length) { 
     length = length + 10; 
     newArr = new int[length]; 
     for (int i = 0; i < nextIndex; i++) 
      newArr[i] = arr[i]; 
     for (int j = nextIndex; j < length; j++) 
      newArr[j] = 0; 
     delete [] arr; 
     arr = newArr; 
    } 
    arr[nextIndex++] = val; 
} 

编辑的数组:我评论删除[ ] arr;它仍然seg故障:/

编辑2:好,所以如果main如下代码工作。任何人都可以解释为什么请问

#include <string> 
#include <iostream> 
#include <sstream> 
#include "include/hugeint.h" 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    string in = "1234"; 
    HugeInt h(in); 

    return 0; 
} 
+1

'DynArray :: add'如何实现? – Naveen

+0

我的猜测是一个滑出界外的数组 –

+0

它在哪里得到这个seg错误?另外,如果你不是,你需要遵循三/五的规则。 – chris

回答

0

在开始使用DynArray add()方法之前,您可能需要在HugeInt构造函数中初始化DynArray。你没有在代码中包含add方法,但是如果它符合我的想象,那么在使用它之前可能没有构建DynArray对象,因此会导致seg错误。

+0

如果没有明确初始化,它将被默认初始化。我认为没关系。 –

+0

它将按原样默认构建。 – chris

0

您发布的代码编译并运行时没有错误。

我可以推测问题发生在其他地方,因为DynArray不符合rule of three

当前,如果以任何方式复制了DynArray,该副本将保持指向相同int *arr的相同指针。

并且当该副本被销毁时,所有其他副本使用的数组也被销毁。

+0

你能看看我上面的第二个编辑吗?为什么它在没有seg错误的情况下以这种方式工作,但是如果我试图直接将字符串作为seg错误的参数传递? – sanghas26

+0

@ user2230341如果您以任何方式获取segfaults,我怀疑您的问题中的代码不是您运行以获取segfault的完整代码。 –