Динамический рост массива в C ++ - PullRequest
0 голосов
/ 11 октября 2010

У меня есть массив указателей объектов CName.У меня есть следующий конструктор, который инициализирует мой массив до размера один.Затем, когда я добавляю объект, я увеличиваю массив на 1 и добавляю новый объект.Он компилируется нормально, однако, когда я пытаюсь распечатать их, я просто получаю ошибку ошибки сегментации.Можете ли вы посмотреть и посмотреть, если я делаю что-то не так?

//constructor
Names_Book::Names_Book()
{
    grow_factor = 1;
    size = 0;
    cNames = (CName**)malloc(grow_factor * sizeof(CName*));
    cNames[0] = NULL;
}

void Names_Book::addCName(CName* cn)
{
    int oldSize = size;
    int newSize = size + 1;

    CName** newCNames = (CName**)malloc(newSize * sizeof(CName*));

    for(int i=0; i<newSize; i++)
    {
        newCNames[i] = cNames[i];
    }

    for(int i=oldSize; i<newSize; i++)
    {
        newCNames[i] = NULL;


    }
    /* copy current array to old array */
    cNames = newCNames;

    delete(newCNames);

    size++;

}

Ответы [ 3 ]

6 голосов
/ 11 октября 2010

Чтобы иметь динамически растущий массив в C ++, вы должны использовать std::vector или хотя бы посмотреть на его реализацию.

3 голосов
/ 11 октября 2010

В этой функции есть несколько ошибок:

void Names_Book::addCName(CName* cn)
{
    int oldSize = size;
    int newSize = size + 1;

    CName** newCNames = (CName**)malloc(newSize * sizeof(CName*));

    for(int i=0; i<newSize; i++)
    {
        newCNames[i] = cNames[
    }

    for(int i=oldSize; i<newSize; i++)
    {
        newCNames[i] = NULL;


    }
    /* copy current array to old array */
    cNames = newCNames; //right here you just leaked the memory cNames was pointing to.

    delete(newCNames);  // right here you delete the new array you just created using the wrong call.

    size++;

}

Ближе к концу вы делаете две вещи совершенно неправильно.(Комментарий выше.)

Эти две последние строки должны быть:

free(cNames);
cNmaes = newCNames;

Кроме того, вы должны делать realloc, а не медленно копировать элементы один за другим ....

С учетом сказанного вам следует использовать вектор. Не пытайтесь (плохо) переписать то, что уже существует.

0 голосов
/ 11 октября 2010

Первый цикл должен быть в oldSize:

for(int i=0; i<oldSize; i++)

cNames недостаточно велик для newSize.

...