0

私は次のコードで示された問題を抱えています、そして私はそれがそれを引き起こしているかもしれないものがわかりません。問題を投稿する前に検索したところ、解放されたメモリの場所への参照など、範囲外の問題である可能性があることがわかりましたが、自分で見つけることはできませんでした。助けてくれてありがとう。

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

5 に答える 5

4

問題は、ポインタの配列を割り当てたが、ポインタ自体には何も割り当てなかったことです。

これにより、ポインタの配列が得られます。

a = new USR*[size];

ただし、各ポインタに何も割り当てたことはありません。

したがって、ここでクラッシュしています:

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

初期化されていないため*uです。


これを修正する方法は2つあります。

  1. USRポインタごとに何かを割り当て(そして初期化)します。
  2. ダブルポインタは使用しないでください。USRオブジェクトの単純な配列を使用するだけです。

あなたが持っているものはおそらく必要以上に複雑なので、私は後者を好みます。

このようなものはおそらくあなたが望むことをするでしょう:

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

デストラクタも必要になることを忘れないでください。

于 2011-11-27T19:57:13.460 に答える
3

メソッドgetUserは初期化されていないポインターを返します(のコンストラクターは初期化されてAいないポインターの配列を作成します)。表示されるエラーは、メソッドが返した初期化されていないポインタを逆参照した結果です。

于 2011-11-27T19:56:23.717 に答える
1

オブジェクトの配列ではなく、新しいUSR*配列を作成するだけです。USRでポインタにアクセスする

USR* u = test.getUser();

ユニタライズされたポインタを提供します。呼び出し

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

したがって、セグメンテーション違反になります。

于 2011-11-27T19:57:34.247 に答える
1

sの配列を初期化しましたが、単一のオブジェクトUSR*を初期化していません。USR*

于 2011-11-27T20:00:22.743 に答える
0

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];
    }
};
于 2015-07-09T08:08:06.780 に答える