所以我有以下课程
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++;
}
这是该类的主要构造函数,它工作得很好....
答案 0 :(得分:1)
首先,检查other.Name
是否填充了指向以空字符结尾的字符串的指针,other.foundationDate
包含以空字符结尾的字符串。也就是说,您将好的指针传递给strlen
和strcpy
。
如果这是真的,请检查作业中的B
是否完全可以访问。
如果这也是真的,printf
一切。并调试发生异常的位置。或者发布可编译并重现错误的整个代码。
另请注意:
this->members = new Person[this->maxMembersCount];
this->members = other.members;
第一个赋值什么都不做(实际上是泄漏内存),而第二个双重删除对象破坏后的内存(如果你正确delete[] members
)。
答案 1 :(得分:1)
这里存在多个问题,其中任何问题都可能是问题的一部分或全部。
Name
或foundationDate
在右侧没有以空值终止,它将会运行并复制坏内存。founder
或members
,如果您不在析构函数中删除它们,则会泄漏内存,或者在导致与内存相关的各种问题时你浅层复制,然后删除两次,等等。要解决此问题,只需制作Name
和foundationDate
std::string
,然后将founder
和members
归为值,而不是指针。如果你必须在堆上分配它们,请使用shared_ptr
之类的智能指针来保存它,而不是容易出错的原始指针。