【问题标题】:C++ struct new with memory bad accessC++ struct new 与内存错误访问
【发布时间】:2013-08-24 12:46:27
【问题描述】:

我正在尝试从以下内容中创建节点。当我尝试不使用“int data”时,我能够实例化一个新的结构成员,但添加了另一个成员变量“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;

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

谢谢,

【问题讨论】:

  • 大错特错,请避免使用指针,不要用NULL初始化std::string。避免 NULL,使用 0 或更好的 nullptr(但不要初始化 std::string!)

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


【解决方案1】:

这里有一些错误:

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

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

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

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

  • 你用NULL初始化你的neighbors成员,但同样,它不是一个指针,你可以从member-initialization-list中跳过它,默认构造函数将被调用,

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

    • @dfsadxsadqwd213 np,很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多