如何删除char **

时间:2014-09-11 14:24:18

标签: c++ pointers

我基本上想知道如何删除双指针,例如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 个答案:

答案 0 :(得分:2)

您需要使用与用于分配的运算符匹配的deletedelete[]运算符。因此new[]后跟delete[]new后跟delete

你无法删除char**,它只是一个指向char的指针。这取决于它实际持有的对象。逻辑上,char**本身包含类似new char*[x]的数组,并且本身填充了使用new char[x]分配的对象。在这种情况下,您需要遍历数组并delete[]那些,然后delete[]外部数组。

答案 1 :(得分:2)

通常你必须遵循两点:

  • 如果您使用new[]进行分配,请使用delete[]进行重新分配,如果new用于分配,则delete必须用于释放内存;
  • 您必须在分配的每个级别释放内存,例如

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

因此,与delete相同类型的new必须调用相同的次数,但顺序相反。