Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::string::assign(std::string const&;)中的分段错误_C++_String_Segmentation Fault_Assign - Fatal编程技术网

C++ std::string::assign(std::string const&;)中的分段错误

C++ std::string::assign(std::string const&;)中的分段错误,c++,string,segmentation-fault,assign,C++,String,Segmentation Fault,Assign,我有以下代码的问题,我不知道是什么原因造成的。在发布问题之前,我搜索了一下,了解到它可能超出了范围,比如对已释放内存位置的引用,但我自己找不到它。 谢谢你帮助我 #include<iostream> #include<string> using namespace std; class USR{ private: string name; public: void setName(string name){ this->name

我有以下代码的问题,我不知道是什么原因造成的。在发布问题之前,我搜索了一下,了解到它可能超出了范围,比如对已释放内存位置的引用,但我自己找不到它。 谢谢你帮助我

#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;
}
#包括
#包括
使用名称空间std;
类USR{
私人:
字符串名;
公众:
无效集合名(字符串名){
此->名称=名称;
}
字符串getName(){
返回名称;
}
};
甲级{
私人:
USR**a;
公众:
A(整数大小){
a=新USR*[尺寸];
}   
USR*getUser(){
返回[0];
}
};
int main(){
A试验=A(5);
USR*u=test.getUser();
(*u).设置名称(“测试”);
USR*u2=test.getUser();

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

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

这将为您提供指针数组:

a = new USR*[size];
但您从未为每个指针分配过任何内容

因此,它在这里崩溃了:

(*u).setName("test");
因为
*u
未初始化


有两种方法可以解决此问题:

  • 为每个
    USR
    指针分配(并初始化)一些内容
  • 不要使用双指针。只需使用一个简单的
    USR
    对象数组
  • 我更喜欢后者,因为你所拥有的可能比它所需要的更复杂

    像这样的东西可能会满足您的需求:

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

    不要忘记,您还需要一个析构函数。

    您只创建了一个新的
    USR*
    数组,而不是
    USR
    对象数组。在

    USR* u = test.getUser();
    
    将给你一个统一的指针。呼叫

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

    因此,您初始化了一个
    USR*
    s数组,但还没有初始化单个
    USR*
    对象。

    正如您声明了一个USR的2D数组,所以我认为您需要用户名数组,尽管我觉得奇怪,为什么您不能简单地使用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];
        }
    };
    
    A类{
    私人:
    USR**a;
    公众:
    A(整数大小){
    a=新USR*[尺寸];
    int-iter=0;
    对于(;iter
    谢谢大家,我接受了比约恩的回答,因为他是第一个回答的人。