1

以下からノードを作成しようとしています。「int データ」なしで試してみると、新しい構造体メンバーをインスタンス化できますが、別のメンバー変数「文字列名」を追加すると、何らかの理由でメモリ リークが発生します。

 struct node
 {
      string name;
      int data;
      vector<node*> neighbors;


      node(string name, int data, node* neighbor)
      {
           this->name = name;
           this->data = data;
           neighbors.push_back(neighbor);
      }

      explicit node()
      : name(NULL), data(NULL), neighbors(NULL) {}

      explicit node(string name)
      : name(name), data(NULL), neighbors(NULL) {}
 };

次の行は、エラー「EXC_BAD_ACCESS (code=1, address=0x0」) が表示される場所です。

 int main() {
      struct node* root = new node(NULL);
      root->name = "root";
      root->data = 10;

メンバー変数が 1 つしかないのにエラーが発生しないのに、メンバー変数がもう 1 つあるのはなぜですか? 何かを初期化するのに欠けていますか?上記のコンストラクターでやっていると思います。アドバイスをお願いします。

ありがとう、

4

2 に答える 2

0

ここにいくつかのエラーがあります:

  • std::stringNULL で初期化しないでください。空stringの が必要な場合は、デフォルトのコンストラクターまたは を使用します""

  • struct node* root = new node(NULL);コンストラクターを呼び出して文字explicit node(string name)列を NULL で初期化するとエラーが発生する場合、

  • 可能な場合はポインタの使用を避けてください: struct node* root = new node();-> struct node root();,

  • dataでメンバーを初期化しますNULLが、これはinteger. で初期化する必要があります0

  • neighborsメンバーをで初期化しますが、これはポインターではありません。 member-initialization-listNULLからスキップできます。デフォルトのコンストラクターが呼び出されます。

  • 最後に、C++ 11 を使用している場合はNULL、 、 use0または eventを使用しないでください。nullptr

于 2013-08-24T12:55:31.840 に答える
0
struct node* root = new node(NULL);

つまり、初期化explicit node(string name)に渡すとエラーが発生します。空の文字列を作成する場合は、.NULLstring""

struct node
{
  string name;
  int data;
  vector<node*> neighbors;

  explicit node(string name)
  : name(name), 
    data(NULL),      //ERROR, data is int type, not pointer
    neighbors(NULL)  //ERROR, not pointer 
    {}  

  explicit node(const std::string& name = "")
  : data(0)  // name,neighbors constructors are implicitly called
于 2013-08-24T12:50:33.627 に答える