这很奇怪 - >行为

时间:2013-06-13 16:50:25

标签: c++ class memory this

所以我有以下课程

class Community
{
private:
  char* Name;
  char foundationDate[11];
  Person* founder;
  int maxMembersCount;
  int membersCount;
  Person* members;
  static int communitiesCount;
     

.....

我想实现一个拷贝构造函数:

Community::Community(const Community& other)
{
    this->Name = new char[strlen(other.Name)+1];
    strcpy(this->Name,other.Name);
    strcpy(this->foundationDate,other.foundationDate);
    this->founder = other.founder;
    this->maxMembersCount = other.maxMembersCount;
    this->membersCount = other.membersCount;
    this->members = new Person[this->maxMembersCount];
    this->members = other.members;
    communitiesCount++;
}

但只要我说社区A = B,这段代码就会崩溃; 所以对我来说这个代码似乎是合法的,但是当我开始调试时,会有消息:this-> “无法读取记忆”。如果您需要更多代码示例,请帮助我,请告诉我。


Community::Community(const char* name , char foundDate[],Person* founder,int maxMembers) {

    this->Name = new char[strlen(name)+1];
    strcpy(this->Name,name);
    strcpy(this->foundationDate,foundDate);
    this->founder = new Person(founder->getName(),founder->getEGN(),founder->getAddress());
    this->maxMembersCount = maxMembers;
    this->membersCount = 2;
    this->members = new Person[this->maxMembersCount];
    communitiesCount++;

}

这是该类的主要构造函数,它工作得很好....

2 个答案:

答案 0 :(得分:1)

首先,检查other.Name是否填充了指向以空字符结尾的字符串的指针,other.foundationDate包含以空字符结尾的字符串。也就是说,您将好的指针传递给strlenstrcpy

如果这是真的,请检查作业中的B是否完全可以访问。

如果这也是真的,printf一切。并调试发生异常的位置。或者发布可编译并重现错误的整个代码。

另请注意:

this->members = new Person[this->maxMembersCount];
this->members = other.members;

第一个赋值什么都不做(实际上是泄漏内存),而第二个双重删除对象破坏后的内存(如果你正确delete[] members)。

答案 1 :(得分:1)

这里存在多个问题,其中任何问题都可能是问题的一部分或全部。

  • 如果NamefoundationDate在右侧没有以空值终止,它将会运行并复制坏内存。
  • 如果对象拥有foundermembers,如果您不在析构函数中删除它们,则会泄漏内存,或者在导致与内存相关的各种问题时你浅层复制,然后删除两次,等等。

要解决此问题,只需制作NamefoundationDate std::string,然后将foundermembers归为值,而不是指针。如果你必须在堆上分配它们,请使用shared_ptr之类的智能指针来保存它,而不是容易出错的原始指针。