【问题标题】:Dynamically Growing an Array in C++在 C++ 中动态增长数组
【发布时间】:2010-10-11 02:23:14
【问题描述】:

我有一个 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++;

}

【问题讨论】:

  • 你应该使用向量。
  • 你在 C++ 中混合 malloc()delete
  • 这不是 C++,这很糟糕;对不起。 :/ 你应该得到a book 并学习好的 C++。

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


【解决方案1】:

要在 C++ 中动态增长数组,您应该使用std::vector 或至少看看它的实现。

【讨论】:

    【解决方案2】:

    这个函数有几个问题:

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

    话虽如此,你应该使用矢量。 不要试图(糟糕地)重写已经存在的东西。

    【讨论】:

    • JoshD 成功了。由于删除,正在发生段错误。您刚刚摆脱了分配的缓冲区。您应该摆脱 cNames,然后将 newCNames 复制到 cNames 以避免内存泄漏。
    【解决方案3】:

    第一个循环应该是oldSize:

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

    cNames 对于 newSize 来说不够大。

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 2021-12-29
      • 2023-01-12
      • 1970-01-01
      • 2021-03-27
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      相关资源
      最近更新 更多