Ошибка сегментации в std :: string :: assign (std :: string const &) - PullRequest
0 голосов
/ 27 ноября 2011

У меня указанная проблема со следующим кодом, и я понятия не имею, что это может быть причиной. Я искал перед публикацией проблемы, и я узнал, что это может быть что-то выходящее за рамки, как ссылка на освобожденную область памяти, но я не мог найти это самостоятельно. Спасибо за помощь мне.

#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;
}

Ответы [ 5 ]

4 голосов
/ 27 ноября 2011

Проблема в том, что вы выделили массив указателей, но вы никогда не выделяли ничего для самих указателей.

Это дает вам массив указателей:

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];
    }
};

Не забывай, что тебе понадобится и деструктор.

3 голосов
/ 27 ноября 2011

Ваш метод getUser возвращает неинициализированный указатель (конструктор A создает массив неинициализированных указателей).Ошибка, которую вы видите, является результатом разыменования неинициализированного указателя, возвращенного методом.

1 голос
/ 28 ноября 2011

Вы инициализировали массив USR* с, но вы не инициализировали отдельные USR* объекты.

1 голос
/ 27 ноября 2011

Вы создаете только новый массив USR* вместо массива USR объектов.Доступ к указателю в

USR* u = test.getUser();

даст вам унифицированный указатель.Следовательно, вызов

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

приведет к сбою.

0 голосов
/ 09 июля 2015

Поскольку вы объявили двумерный массив USR, я думаю, что у вас есть требование Array of Array для имен пользователей, хотя мне это кажется странным, почему вы не можете просто использовать 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];
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...