在C ++中使用自由2D指针矩阵时崩溃

时间:2015-12-28 06:10:19

标签: c++ visual-studio matrix visual-studio-2015

我在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;

然而,我收到了一个错误,如下图所示。在删除之前我需要检查矩阵而不是NULL吗? enter image description here

有时,它像人物一样崩溃了 enter image description here

我发生了什么?你能帮我解决一下吗?这是我的完整源代码

#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;
}

2 个答案:

答案 0 :(得分:1)

你的代码看起来对我很好。可能存在问题的唯一地方是:

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

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

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

或添加特殊逻辑以考虑其中一个设置为零的情况。

答案 1 :(得分:0)

代码似乎没问题。

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

相关问题