在 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 指针矩阵时崩溃的主要内容,如果未能解决你的问题,请参考以下文章