我在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吗?
我发生了什么?你能帮我解决一下吗?这是我的完整源代码
#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;
}
答案 0 :(得分:1)
你的代码看起来对我很好。可能存在问题的唯一地方是:
M0 = random(range);
m_L0 = random(range);
这样,M0
和/或m_L0
可能为零。我建议将它们改为:
M0 = random(range) + 1;
m_L0 = random(range) + 1;
或添加特殊逻辑以考虑其中一个设置为零的情况。
答案 1 :(得分:0)
代码似乎没问题。
可能是您为对象或没有正确处理0字节请求的数组定义(或者您正在使用)自定义全局内存分配器?