C++ 如何删除字符**

C++ 如何删除字符**,c++,pointers,C++,Pointers,我基本上想知道如何删除双指针,例如char**。这是因为我遇到了一个我不太理解的访问冲突问题。代码如下: StatsManager::_statsNameList = new char*[StatsManager::MAX_STATS_COUNT*StatsManager::MAX_CHANNEL_COUNT*StatsManager::MAX_ROI_COUNT]; if(NULL != StatsManager::_statsNameList ) { for (in

我基本上想知道如何删除双指针,例如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!=普利斯特还能通过吗

删除字符**的正确方法是什么?非常感谢。

您需要使用与用于分配的运算符匹配的delete或delete[]运算符。所以new[]后面跟着delete[],new后面跟着delete


不能删除字符**,它只是指向字符的指针。这取决于它实际持有的对象。从逻辑上讲,char**本身将包含一个类似new char*[x]的数组,并且本身填充了分配有new char[x]的对象。在这种情况下,您需要在数组上循环并删除[]个数组,然后删除[]个外部数组。

通常您必须遵循两点:

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

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

delete *pp;
delete pp;

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

您有一个new语句和两个delete语句,这应该告诉您:正确的方法:使用容器类,例如std::vector和std::string,或者至少使用智能指针。@Raxvan但我认为第二次删除不应该命中,因为它是坏指针?@crashmstr你的意思是没有办法使用char**?@Ono所以你分配了一堆内存,最后删除它到目前为止似乎是合法的,但是,中间的删除是删除什么内存分配的内存应该在哪里删除?我想这就是我做的吗?在外部列表中循环以删除内部的所有人?因此对于我的情况,它应该是一个循环,在其中删除[]每个字符*?@Ono请密切注意第二条新语句*pp=new int,您的代码中缺少该选项。int**pp是int指针的指针,如果要删除itI,必须分配每个指针级别。因此,在删除整个字符**之前,我应该为字符**中的每个项目添加一个新的[]字符*,我理解正确吗?@Ono。是的,如果不是数组,则应新建;如果每个字符*都有一个数组,则应新建[]。然后您应该在循环中使用相同的delete操作符变体。谢谢。我认为你的答案对我来说更有意义。