我基本上想知道如何删除双指针,例如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**
的正确方法是什么?非常感谢。
答案 0 :(得分:2)
您需要使用与用于分配的运算符匹配的delete
或delete[]
运算符。因此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
必须调用相同的次数,但顺序相反。