-1

次のような「Vertex.hpp」というクラスがあります。

 #include <iostream>
 #include "Edge.hpp"
 #include <vector>
   using namespace std;

/** A class, instances of which are nodes in an HCTree.
 */
class Vertex {
public:
Vertex(char * str){
 *name=*str;
 }

vector<Vertex*> adjecency_list;
vector<Edge*> edge_weights;
char *name;

 };

#endif 

次のように、Vector 型のオブジェクトをインスタンス化すると、次のようになります。

 Vertex *first_read;
 Vertex *second_read;

  in.getline(input,256);

  str=strtok(input," ");
  first_read->name=str;


  str=strtok(NULL, " ");
  second_read->name=str;

Vector 型のオブジェクトが複数インスタンス化されると、セグメンテーション違反が発生します。複数のオブジェクトがインスタンス化されている場合、これが発生するのはなぜですか? また、複数のオブジェクトをインスタンス化できるようにするにはどうすればよいですか?

4

3 に答える 3

2
*name=*str;

最初に何かを指すようにするまで、ポインターを逆参照することはできません。

あなたはおそらく次のようなことを意味していました:

Vertex(char * str) {
    name=strdup(str);
}

しかし、あなたは本当に使うべきですstd::string

于 2012-12-04T23:02:25.983 に答える
0

これは非常に C 的なやり方であり、現代の C++ では非常に推奨されていません。C++ は、Cの厳密なスーパーセットではなく、別の言語として扱う必要があることに注意してください。

まず第一に、多くの基本が欠けているように見えるので、そのリストを見て本当に良い本を手に入れる必要があります.

あなたの問題に関しては、主な問題は初期化されていないため、未定義の動作nameと呼ばれるものに遭遇します(つまり、何かが起こる可能性があります;あなたの場合、2番目のインスタンス化でクラッシュします)。メモリを動的に割り当てることでそれを修正する方法について詳しく説明できますが、なぜわざわざするのでしょうか? を使用するだけです:std::string

class Vertex {
    std::string name; // string instead of char *
public:
    Vertex(const std::string &str) { // pass by const reference
        name = str; // I should really use an initializer list there, but oh well
    }

    // the rest of the class is the same
};

それがどのように簡単であるかがわかりますか?これで、使用するのが面倒なポインターをいじる必要がなくなりました。要するに、標準ライブラリを使用してください。そして良い本を手に入れてください。本当。

于 2012-12-04T23:20:51.007 に答える
0

文字列をコピーする方法が間違っていると思います。

*name=*str;

どちらのnameansstrも char* 型です。これらのポインターを逆参照しています。これは、それらが指すメモリの位置を見て、それをcharとして解釈することを意味します。

初めて呼び出すと、何かが指す場所にstrあり、その最初の文字がランダムアドレスにコピーされます(初期化されていないためname)。

二度目はあなたはそれほど幸運ではありません。cplusplusstrtokで NULL リターン NULL strtok で呼び出されます

今、あなたはヌルポインタが指すメモリを操作しようとしましたが、それは悪いことです.

メモリを割り当ててname、適切なコピー機能を使用する必要があります。

name = new char[SomeMaxLenght];
strcpy(name, str);
于 2012-12-04T23:19:53.900 に答える