C ++ struct new,内存访问不良

时间:2013-08-24 12:46:27

标签: c++ memory-management memory-leaks struct nodes

我正在尝试创建以下节点。当我尝试使用“int data”时,我能够实例化一个新的struct成员,但是添加了另一个成员变量“string name”,由于某种原因,我得到了内存泄漏。

 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;

为什么我只有一个成员变量没有错误,但是我又做了一个成员成员变量?我错过了初始化的东西吗?我想我正在做上面的构造函数。请给我一些建议。

谢谢,

2 个答案:

答案 0 :(得分:0)

struct node* root = new node(NULL);

调用explicit node(string name)构造函数,这意味着您将NULL传递给初始化string会导致错误。如果你想构造一个空字符串传递""

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

答案 1 :(得分:0)

这里有一些错误:

  • 不要使用NULL初始化std::string。如果您想要一个空的string,请使用默认构造函数或""

  • 当您致电struct node* root = new node(NULL);时,您调用构造函数explicit node(string name)并使用NULL初始化字符串会导致错误,

  • 尽可能避免使用指针:struct node* root = new node(); - &gt; struct node root();

  • 您使用data初始化了NULL成员,但这是integer。您应该使用0

  • 对其进行初始化
  • 您使用neighbors初始化NULL成员,但同样,它不是指针,您可以从成员初始化列表中跳过它,将调用默认构造函数,

  • 最后,如果您使用的是C ++ 11,请避免使用NULL,使用0或事件nullptr