代码之家  ›  专栏  ›  技术社区  ›  Ono

如何删除字符**

  •  -1
  • Ono  · 技术社区  · 11 年前

    我基本上想知道如何删除双指针,例如char**。这是因为我遇到了一个我不太理解的访问违规问题。代码如下:

    StatsManager::_statsNameList = new char*[StatsManager::MAX_STATS_COUNT*StatsManager::MAX_CHANNEL_COUNT*StatsManager::MAX_ROI_COUNT];
    
    if(NULL != StatsManager::_statsNameList )
        {
            for (int i = 0; i < StatsManager::MAX_CHANNEL_COUNT; i++ )
            {
                for (int j = 0; j < StatsManager::MAX_ROI_COUNT; j++ )
                {
                    for (int k = 0; k < StatsManager::MAX_STATS_COUNT; k++ )
                    {
                        char* pList = StatsManager::_statsNameList[i*area + j*StatsManager::MAX_STATS_COUNT + k];
                        if (NULL != pList)
                        {
                           // following line is where the exception throws
                            delete[] StatsManager::_statsNameList[i*area + j*StatsManager::MAX_STATS_COUNT + k];
                            StatsManager::_statsNameList[i*area + j*StatsManager::MAX_STATS_COUNT + k] = NULL;
                        }
                    }
    
                }
            }
        }
    
        delete[] StatsManager::_statsNameList;
        StatsManager::_statsNameList = NULL;
    

    我很困惑,因为对于异常抛出的内部循环,我看到pLsit是一个坏指针,所以 if (NULL != pList) 还是通过了?

    删除 char** ? 谢谢。

    2 回复  |  直到 11 年前
        1
  •  2
  •   grzkv    11 年前

    通常你必须遵循两点:

    • 如果您使用 new[] 供分配使用 delete[] 用于解除分配,如果 new 已用于分配 delete 必须用于释放内存;
    • 您必须在分配的每个级别释放内存,例如。

      int **pp = new *int;
      *pp = new int;
      **pp = 5;
      
      delete *pp;
      delete pp;
      

    所以 删去 与相同类型 必须调用相同的次数,但顺序相反。

        2
  •  2
  •   Niels Keurentjes    11 年前

    您需要使用 delete delete[] 与用于分配的运算符匹配的运算符。所以 new[] 之后是 删除[] new 通过 删去 .

    您不能删除 char** ,它只是指向一个字符的指针。这取决于它实际持有的物体。逻辑上 字符** 将包含一个数组 new char*[x] ,并且本身填充有分配给 new char[x] 在这种情况下,您需要在数组上循环 删除[] 那些,那么 删除[] 外部阵列。