在 C++ 中释放 2D 指针矩阵时崩溃

Posted

技术标签:

【中文标题】在 C++ 中释放 2D 指针矩阵时崩溃【英文标题】:Crash when free 2D pointer matrix in C++ 【发布时间】:2015-12-28 06:10:19 【问题描述】:

我在 C++ 中使用 2D 指针矩阵(使用 Visual Studio 2015)。我创建了矩阵并在完成后将其删除。

typedef unsigned char  U8;
typedef unsigned int   U32;
U8** A0 = new U8*[M0];
for (U32 i = 0; i < M0; ++i)

    A0[i] = new U8[m_L0];

for (U32 i = 0; i < M0; ++i)
    if (i < m_L0)
    
        delete[] A0[i];
        A0[i] = NULL;
    

delete[] A0;
A0 = NULL;

但是,我得到了如下图所示的错误。在删除之前我需要检查矩阵不为空吗?

有时,它像人影一样坠毁

我怎么了?你能帮我修一下吗?这是我的完整源代码

#include <iostream>
#include <stdlib.h>
#include <time.h>       /* time */
#define random(x) (rand()%x)
typedef unsigned char  U8;
typedef unsigned int   U32;
class CData

private:
    U8* m_Data;
    U32  m_Len;
public:
    CData(void) : m_Data(NULL), m_Len(0)
    
    
    ~CData(void)
    
        FreeData();
    
    void FreeData()
    
        if (m_Data)
        
            delete[] m_Data;
            m_Data = NULL;
        
    
;
void create_and_delete_matrix()

    U32 M0;
    U32 m_L0;
    U32 range = 20;
    M0   = random(range);
    m_L0 = random(range);
    U8** A0 = new U8*[M0];
    for (U32 i = 0; i < M0; ++i)
    
        A0[i] = new U8[m_L0];
    
    for (U32 i = 0; i < M0; ++i) 
        for (U32 j = 0; j < m_L0; ++j)  
            A0[i][j] = random(2);
            printf("%d ", A0[i][j]);
        
        printf("\n");
    
    CData** D0 = new CData*[M0];
    for (U32 i = 0; i < M0; ++i)
        D0[i] = new CData();
    

    //free A0, C0, D0 matrix
    for (U32 i = 0; i < M0; ++i)
        if (i < m_L0)
        
            delete[] A0[i];
            A0[i] = NULL;
        
        delete D0[i];
        D0[i] = NULL;
    
    delete[] A0;
    A0 = NULL;

    delete[] D0;
    D0 = NULL;


int main(int argc, char **argv) 
    unsigned int time_ui = static_cast<unsigned int>(time(NULL));
    srand(time_ui);
    for (U32 iter = 0; iter < 100; iter++)
        create_and_delete_matrix();
    
    return 0;

【问题讨论】:

【参考方案1】:

在我看来,您的代码基本没问题。唯一可能有问题的地方是:

M0   = random(range);
m_L0 = random(range);

这样,M0 和/或m_L0 可能为零。我建议将它们更改为:

M0   = random(range) + 1;
m_L0 = random(range) + 1;

或添加特殊逻辑来解决其中一个设置为零的情况。

【讨论】:

为什么 0 应该是个问题?您是否在代码中看到任何不正确的情况? @6502,我在标准中找不到任何内容表明将0 传递给operator new [] 是否可以。 @6502,感谢您的链接。基于此,使用0 作为参数调用operator new [] 应该没问题。【参考方案2】:

代码看起来没问题。

您是否为无法正确处理 0 字节请求的对象或数组定义(或正在使用)自定义全局内存分配器?

【讨论】:

以上是关于在 C++ 中释放 2D 指针矩阵时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中的 2D 动态内存分配数组中释放分配的内存

C ++释放共享库中动态分配的内存导致崩溃

释放动态数组初始化时程序崩溃

仅在一定限度内释放 2D 指针数组的内存

std::vector<cocos2d::Sprite* > m_iDange ;怎么释放内存!

C++ - 未分配被释放的指针