用C ++动态增长数组

时间:2010-10-11 02:23:14

标签: c++ arrays dynamic memory-management malloc

我有一个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 个答案:

答案 0 :(得分:6)

要在C ++中拥有可动态增长的数组,使用std::vector或至少查看其实现。

答案 1 :(得分:3)

此功能有一些问题:

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而不是慢慢地逐个复制元素....

据说,你应该使用vector。 不要试图(糟糕地)重写已经存在的东西。

答案 2 :(得分:0)

第一个循环应该是oldSize:

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

cNames对于newSize来说还不够大。