2011-11-27 152 views
-1

我有以下代码指出的问题,我不知道它可能会导致它。在发布问题之前,我搜索了一下,我发现它可能是一个超出范围的东西,就像对释放内存位置的引用,但我无法自己找到它。 谢谢你帮助我。在std :: string :: assign(std :: string const&)中的分段错误

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

class USR{ 
private: 
    string name; 
public: 
    void setName(string name){ 
     this->name = name; 
    } 
    string getName(){ 
     return name; 
    } 

}; 

class A{ 
private: 
    USR* * a; 
public: 
    A(int size){ 
     a = new USR*[size]; 
    } 
    USR* getUser(){ 
     return a[0]; 
    } 
}; 

int main(){ 
    A test = A(5); 
    USR* u = test.getUser(); 
    (*u).setName("test"); 
    USR* u2 = test.getUser(); 
    cout << (*u2).getName() << endl; 
    cout << (*u).getName() << endl; 
} 
+0

谢谢你们每一个人,我接受了比约恩的答案,因为他是第一个回复。 –

回答

2

你的方法getUser返回一个未初始化的指针(的A的构造函数创建未初始化指针数组)。您看到的错误是取消引用该方法返回的未初始化指针的结果。

3

问题是您分配了指针数组,但您从未为指针本身分配任何内容。

这给你的指针数组:

a = new USR*[size]; 

但是你从来没有分配给每个指针的东西。

因此,它的崩溃在这里:

(*u).setName("test"); 

因为*u未初始化。


有两种方法来解决这个问题:

  1. 分配(和初始化)东西各USR指针。
  2. 请勿使用双指针。只需使用一组简单的USR对象。

我更喜欢后者,因为你有什么可能比它需要更复杂。

像这样的事情可能会做你想要什么:

class A{ 
private: 
    USR *a; 
public: 
    A(int size){ 
     a = new USR[size]; 
    } 
    USR* getUser(){ 
     return &a[0]; 
    } 
}; 

不要忘了,你会想析构函数为好。

1

您只创建一个新的USR*而不是一组USR对象。访问指针

USR* u = test.getUser(); 

会给你一个单位指针。致电

(*u).setName("test"); 

将因此段故障。

1

您初始化了一个USR* s的数组,但您尚未初始化单个USR*对象。

0

正如你已经宣布USR的二维数组,所以我想你的用户名的数组的数组的要求,虽然看起来怪我为什么不能只需使用USR * userArray;

无论如何,如果你想要的用户名的数组的数组来工作,那么你需要修改你的A级如下:

class A{ 
private: 
    USR* * a; 
public: 
    A(int size){ 
     a = new USR*[size]; 
     int iter = 0; 
     for(; iter < size; iter++) 
     { 
      a[iter] = new USR[size_of_user_names_for_each_user_array]; 
     } 
    } 
    USR* getUser(){ 
     return a[0]; 
    } 
}; 
相关问题