0

私はC++にかなり慣れていないので、次のようなコードでポインタを割り当てるとセグメンテーション違反が発生し続けます。割り当てられていないメモリにアクセスしていることを意味しますが、どこにあるのかわかりません。

私には2つのクラスがあります:

class ClassA{ //class a decl.
  ClassB** oArray;
  unsigned int x;
 public:
  ClassA(unsigned int X);
  void oMember(ClassB* classb);
}


ClassA::ClassA(unsigned int X){ //Constructor for class a
  x = X;
  oArray = new ClassB* [x];

 for (unsigned int i = 0; i < x; i++){
        oArray = NULL; 
    }
}

class ClassB{ //rough decl of class B
  public:
   getId();
}

次のような別のクラスへのポインタを受け取るクラスメンバー関数があります。

void ClassA::oMember(ClassB* classb){
   unsigned int cID = classb.getId(); //defined in class b
   oArray[cID] = classb; //if cID is less than x defined in constructor, is this legal?
}

配列のcID番目のメンバーをclassbにポイントしたいだけです。

上記のような割り当てでセグメンテーション違反が発生し続けます。理由はよくわかりません。cIDを出力しましたが、ClassAのコンストラクターで宣言した配列のサイズよりも間違いなく小さくなっています。

その割り当てが違法であるのはなぜですか、またはセグメンテーション違反が発生しているのはなぜですか?

4

3 に答える 3

1

ClassAを次のように変更する必要があると思います

class ClassA{
  std::map<int, std::shared_ptr<ClassB> > mMap;

 public:
  ClassA();
};

これで、クラスAは配列サイズを知る必要がなくなり、mMapにより、非常にスパースな配列がないことが保証されます。

于 2012-07-22T16:28:25.697 に答える
1

チャットで気付いたので、参考のためにここに問題を記録します。

問題は作品にあります

RegisteredVMs = new VendingMachine *[nVendingMachines];
for (unsigned int i = 0; i < nVendingMachines; i++){
   RegisteredVMs = NULL; 
}

RegisteredVMが割り当てられ、すぐにNULLに設定されます。このポインタは、後でVMregister()関数でアクセスされ、セグメントが発生します。障害。

ポインタは硬く、エラーが発生しやすいです。他に方法がない場合にのみ使用してください。これは宿題の問題であり、インターフェースについては何も言えないと言っているので、それらを使用する必要があると思います。

于 2012-07-22T17:39:37.490 に答える
0

代わりに、ポインタである限り、そうclassb.getId()すべきだと思います。まあ、それはコンパイラエラーであるはずであり、それがセグメンテーション違反を起こす理由ではないと思います。classb->getId()classb

ClassAその特定のコンストラクターでインスタンス化してもよろしいですか?そうでない場合、xおよびoArrayは初期化されない可能性があります。

私はあなたのコードを持っていません。しかし、次のようにコードセグメントを変更したところ、セグメンテーション違反やコンパイラの警告は見つかりませんでした。

class ClassB {
public:
    int getId();
};

class ClassA {
    ClassB** oArray;
    unsigned int x;
public:
    ClassA(unsigned int X);
    void oMember(ClassB* classb);
};

int ClassB::getId() {
    return 0;
}

ClassA::ClassA(unsigned int X) {
    x = X;
    oArray = new ClassB* [x];
}

void ClassA::oMember(ClassB* classb) {
    unsigned int cID = classb->getId();
    oArray[cID] = classb;
}

int main(int argc, char** argv) {
    ClassA a(12);
    ClassB b;
    a.oMember(&b);
    return 0;
}
于 2012-07-22T16:42:40.980 に答える