【问题标题】:Crash when free 2D pointer matrix in C++在 C++ 中释放 2D 指针矩阵时崩溃
【发布时间】: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;
}

【问题讨论】:

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


    【解决方案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 字节请求的对象或数组定义(或正在使用)自定义全局内存分配器?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多