访问冲突写入0xcdcdcef#,对象内的对象

时间:2013-08-13 18:56:46

标签: c++

嘿所以我对C ++很新,我不确定为什么这不起作用。我有两个类,让我们称他们为ned和myfile。我需要在每个ned对象中有两个文件对象。这是一个简化:

class myfile {
  public:
      int nData;
      int nHeaderSize;

  myfile() {
    nData=0;
    nHeaderSize=0;
  }
};

class ned {
  public:
    myfile *pSrc,*pTgt;

  ned() {
   myfile* pSrc = new myfile();
   myfile* pTgt = new myfile();
  }
};

int main(int argc, char* argv[]) {
  ned* nedObj = new ned();
  nedObj->pSrc->nData=5; //Access violation error here
}

这显然是一个简化版本,但任何想法都值得赞赏。如果从这个小例子中问题不明显,我可以添加更多代码。

编辑:修正了在转换为较小的示例时输入错误的分号

4 个答案:

答案 0 :(得分:4)

更改

ned() {
  myfile* pSrc = new myfile();
  myfile* pTgt = new myfile();
}

ned()
: pSrc(new myfile),
  pTgt(new myfile) {
}

目前,您的代码未初始化nedObj。相反,ned的构造函数会创建两个名为pSrcpTgt的局部变量。变量很快就会超出范围,泄漏资源。

答案 1 :(得分:3)

class ned {
  public:
    myfile *pSrc;*pTgt;

  ned() {
   myfile* pSrc = new myfile();
   myfile* pTgt = new myfile();
  }
};

应该是:

class ned {
  public:
    myfile *pSrc;*pTgt;

  ned() {
   this->pSrc = new myfile();
   this->pTgt = new myfile();
  }
};

答案 2 :(得分:0)

我继续为你修好

class myfile {
public:
  int nData;
  int nHeaderSize;

myfile() {
  nData=0;
  nHeaderSize=0;
  }
}; **//missing semicolon here**

class ned {
public:
  myfile *pSrc, *pTgt; **//was myfile *pSrc;*pTgt, needed a coma instead**

ned() {
 myfile* pSrc = new myfile();
 myfile* pTgt = new myfile();
  }
}; //missing semicolon here

int main(int argc, char* argv[]) {
   ned* nedObj = new ned();
   nedObj->pSrc->nData=5; **//Access violation error here**
}

答案 3 :(得分:-1)

将构造函数更改为:

ned() {
 pSrc = new myfile(); // pSrc is an already defined member.
 pTgt = new myfile(); // Same for pTgt.
}

如果您使用myfile* pSrc,则声明一个与pSrc成员变量不同的新变量。 还记得释放记忆:

~ned()
{
delete pSrc; 
delete pTgt;
}