无法将字符串分配给动态数组位置

时间:2014-03-03 19:02:30

标签: c++ class dynamic-arrays assign

尝试将字符串添加到动态数组时,出现“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]; 
}

1 个答案:

答案 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),则整个问题就会消失。