2 qq 20880415 qq_20880415 于 2016.03.09 19:19 提问

关于内存delete报错的问题,以下代码在最后delete的时候 10C

(safe_deletevec是宏定义,如果指针不等于NULL,就删除并置NULL),就会报错,说是写入冲突,应该没有越界,可是就是想不通为什么出错,麻烦各位给些建议

short Nobone=m_sMinValue+50;
int m_nValueMax=0;
for(int i = 0; i < m_nOriImagePiece; i++)
{
int k = i*m_nWidth*m_nHeight;
for (int m = 0; m < m_nHeight; m++)
{
int v = m*m_nWidth + k;
for (int n = 0; n < m_nWidth; n++)
{
int a = ((short*)m_pProcessArray->GetDcmArray()[i]->GetData())[m_nWidth*m + n];
if (a>Nobone)
{
short m_nRadi = EDTdate[v+n];
if (m_nRadi>m_nValueMax)
m_nValueMax = m_nRadi;
}
}
}
}

m_nValueMax = m_nValueMax + 1;
short* occurs = new short[m_nValueMax];
memset(occurs , 0 ,sizeof(short)*m_nValueMax);

for(int i = 0; i < m_nOriImagePiece; i++)
{
    int k = i*m_nWidth*m_nHeight;
    for (int m = 0; m < m_nHeight; m++)
    {
        int v = m*m_nWidth + k;
        for (int n = 0; n < m_nWidth; n++)
        {
            int a = ((short*)m_pProcessArray->GetDcmArray()[i]->GetData())[m_nWidth*m + n];
            if (a>Nobone)
            {
               short m_nRadi = EDTdate[v+n];
               occurs[m_nRadi] = 1;
            }
        }
    }
}

numRadii = 0;
for (int i=0;i<m_nValueMax;i++)
{
    if (occurs[i])
        numRadii++;
}
//make an index of the distance-squared values
short* distSqIndex = new short[m_nValueMax];
memset(distSqIndex,0,sizeof(short)*m_nValueMax);
short* distSqValues = new short[numRadii];
memset(distSqValues,0,sizeof(short)*numRadii);
int indDs = 0;
for (int i=0;i<m_nValueMax;i++)
{
    if (occurs[i])
    {
        distSqIndex[i] = indDs;
        distSqValues[indDs++]=i;
    }
}
Safe_DeleteVec(occurs);

4个回答

cxsmarkchan
cxsmarkchan   2016.03.09 19:37

检查两个地方:
1. short m_nRadi = EDTdate[v+n];得到的m_nRadi是否可能越界
2. occurs指向数组,删除时应该是delete[] occurs而不是delete occurs
希望对你有帮助。

cxsmarkchan
cxsmarkchan 回复小看我没门: 是否能具体定位到出错的代码?感觉代码不会在delete那里报错Orz...
2 年多之前 回复
qq_20880415
qq_20880415 删除是delete[] occurs的,越界之前也检查过了,其他还能想到什么地方可能出错吗?真的很困惑,明明没错的
2 年多之前 回复
WinsenJiansbomber
WinsenJiansbomber   2016.03.09 20:08

不能把delete理解为删指针啊!delete是内存回收,它需要一个指向内存地址的指针,这样内在管理系统就会标记所目标内存是可用的。但是不能对同一个地址连续执行两次。

qq_20880415
qq_20880415 我清楚的,不好意思表达有问题,我并没有删两次的
2 年多之前 回复
visoncomputer
visoncomputer   2016.03.09 20:28

short m_nRadi = EDTdate[v+n];应该是这里的问题了。或者memset(occurs , 0 ,sizeof(short)*m_nValueMax);这里好像只对char型有效。另外的就看不出了。

li744831579
li744831579   2016.03.09 21:18

你可以每一块加个输出,看看哪里有问题,加个断点看看。int和short类型有隐式转换,都检查下

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
析构的问题
关于以下代码,哪个说法是正确的? 1 2 3 4 5 6 7 8 myClass::foo(){ delete this; } .. void func(){ myClass *a = new myClass(); a->foo(); } 正确答案: B 你的答案: C (错误)a它会引起栈溢出 b都不正确 c它不能编译 d它会引起
c++, delete无法释放内存,太奇怪了
1:大家看看下面代码;居然打印两次“func1 exec !”;各位大师分析下是何原因!为何 delete obj;     obj = NULL;这两句没起作用;我觉得这种现象有点奇怪。问了几个人居然都无法解释。 #include #include #include using namespace std;class abc{     public:        void fu
C++之delete常见错误总结
1、动态分配内存后释放了一次,再次释放 1)直接删除2次 int main() { int *a = new int(50); cout<<*a<<endl; delete a; delete a; return 0; } 2)另外一个指针指向分配的内存,然后把这个2个指针都删除 int* p1 = new int(50); int* p2 = p1; /
char*、new和delete联合使用的问题
一个测试例子如下: char *strc = new char[5]; strc[0] = '\0'; strcat(strc,"12345"); delete[] strc; 看似没问题,字符串strc分配空间正确并且将"12345”连接赋值给它。但是问题出现在这里:delete[] strc; 为什么呢?因为strc用new分配空间时在堆中有5个连续的字节,在将"1
C++ delete报错原因
C++ delete报错原因释放内存两种方式:new deletenew [] delete []出错现象:1.执行delete语句时,程序直接弹窗,崩溃。2.执行delete语句时,程序卡死。将delete语句注释掉,又正常了,但发生了内存泄露。原因分析:1.数组首地址被无意更改。例如:int A[10]; A++;2.作用域不同。例如:在函数A中new的内存 int p = new int
c++ new和delete产生的debug error
void main() { char *p = new char; cin>>p; cout delete p; } 在以上代码中,如果你输入:abcd,那么如你所望,你会看到"正确"的输出"c"。但是会有错误提示出现: Debug Error! Program: test.exe DAMAGE: after Normal block(#64) at 0x003429f8
VS2010 C++ 学习笔记(二) 内存管理 new delete
内存的申请与示范  ***************************************************************************************** ********************************************************
new一个数据,在初始化时的不慎,将导致 delete[] 时出错,列举了几点参考
错误1 char* a = new char[100]; for (int i = 0; i   *(a++) = 0;看起来没有什么问题,事实上,指针a指向的地址在不断变化,最后需要释放空间时会出错,具体原因还不太清楚: delete[] a;  // error: violate access ...正确的做法之一: char* a = new char[100]; int
关于delete释放指针要注意的问题
delete的时候,系统只是将指针指向的堆空间回收,但是没有将指针变量 的值赋值为null,也就是说指针还是指向原来的堆空间,但是这个空间已经失效 所以delete一个指针以后要马上将它赋值为null 不然容易导致野指针的出现
动态内存开辟:new/delete,malloc/free区别与联系
本博客主要说明new/delete,malloc/free的区别与联系,如下: 1.malloc/free为C的标准库函数,函数原型为: void* malloc(size_t size)//参数代表字节个数void free(void* pointer)//参数代表内存地址new、delete则为C++的操作运算符,它调用的分别为赋值运算符重载operator new()和operator