尝试将字符串添加到动态数组时,出现“EXC_BAD_ACCESS”错误。难道我做错了什么?以下是一些代码片段:
typedef unsigned short ushort_t;
typedef string* stringPtr_t;
class Doctor {
private:
string doctorName;
stringPtr_t patientArray;
ushort_t patientArraySize;
ushort_t numOfPatient;
bool Doctor::addPatient(string patientName)
{
patientArray[numOfPatient].assign(patientName);
numOfPatient++;
return true;
}
Doctor& Doctor::operator =(const Doctor& docSource)
{
for (int i = 0; i < docSource.patientArraySize; i++) {
patientArray[i].assign(docSource.patientArray[i]);
}
return *this;
}
};
int main()
{
Doctor testDoc5(2);
cout.clear();
assert(testDoc5.addPatient("Bob Smith")==true);
}
Doctor::Doctor(ushort_t patientArrayCapacity)
: doctorName("need a name.")
, patientArraySize(patientArrayCapacity)
, numOfPatient(0)
{
patientArray = *new stringPtr_t[patientArraySize];
}
答案 0 :(得分:0)
可疑线是:
patientArray = *new stringPtr_t[patientArraySize];
让我们更详细地研究一下。
扩展(替换typedef)导致
patientArray = * new string * [patientArraySize];
查看分配部分:
new string * [patientArraySize];
分配一个指向字符串的指针数组。这可能不是你想要的。
下一部分:
* (new string * [patientArraySize]);
取消引用指向字符串数组的指针,从而引用数组的第一个元素。
最后,作业:
patientArray = * (new string * [patientArraySize]);
将数组位置零的内容分配给变量patientArray
。这是合法的,因为你告诉编译器你正在为字符串分配一个指针数组。
副作用:
你丢失了数组开始的位置。也称为内存泄漏
2. patientArray
指针的内容未定义,因为您没有在数组的第一个位置初始化指针值。
也许你想要:
patientArray = new string [patientArraySize];
分配一个字符串数组并分配给指针patientArray
。
如果您使用std::vector<string>(patientArraySize)
,则整个问题就会消失。