调试断言失败_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

Posted

技术标签:

【中文标题】调试断言失败_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)【英文标题】:Debug Assertion Failed _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 【发布时间】:2014-03-05 23:49:45 【问题描述】:

我遇到了这个问题:

调试断言失败!

文件:f:\dd\vctools\crt_bld\self_x86\crt\dbgdel.cpp

第 52 行

表达式"_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)

我的程序将所有值正确返回到我期望的屏幕,但是这个问题 让我紧张...

#include <iostream>
#include <cstdlib>
#include <iomanip>


using namespace std;

double * wsk1;
double * wsk2;
double * wsk3;
double * kopiowanie(double *wsk1,double *wsk2, double *wsk3);
double * zaladuj(double *wsk1,double*wsk2);
int main()

    wsk1 = new double [30]; // tak inicjalizuje sie dynamicznie tablice
    wsk2 = new double [30];
    wsk3= new double [30];
    zaladuj(wsk1,wsk2);
    kopiowanie(wsk1,wsk2,wsk3);
    for (int i=0;i<30;i++)
    
        cout << setw(10) << *wsk1 << setw(10) << *wsk2 << setw(10) << *wsk3 << endl;
        wsk1++;
        wsk2++;
        wsk3++;
    
    wsk1 -=29;
    wsk2 -=29;
    wsk3 -=29;


    delete[] wsk1;
    delete[] wsk2;
    delete[] wsk3;

    system("pause");


double * zaladuj(double * wsk1, double * wsk2)


        for(int i=0;i < 30;i++)
        
            *wsk1 = i;
            *wsk2 = i;
            wsk1++;
            wsk2++;
        
        wsk1 -=29 ;
        wsk2 -= 29;

        return wsk1, wsk2;



double * kopiowanie(double *wsk1,double*wsk2, double*wsk3)

        for(int i=0; i<30;i++)
        
            *wsk3 = (*wsk1)  * (*wsk2); 
            wsk3++;
            wsk2++;
            wsk1++;
        
        wsk1 -=29;
        wsk2 -=29;
        wsk3 -=29;
        return wsk1,wsk2,wsk3;

【问题讨论】:

所有这些指针让紧张。 据我所知,你想要的只是两个由std::iota 操作的数组,然后是另一个由std::transform 操作的数组,它将其他两个元素相乘。一点都不需要指针或全局变量。 这应该完成什么? return wsk1, wsk2; 这个? return wsk1,wsk2,wsk3;想解释一下你对这段代码的意图是什么? 【参考方案1】:

这是一个内存损坏错误,发生这种情况是因为你 deleteing 的东西你没有 new

这段代码是错误的:

wsk1 -=29;
wsk2 -=29;
wsk3 -=29;

您有 30 次循环迭代,这意味着对 ++ 的三十次调用,意味着您还需要对 -= 30 进行调用。

当你弄错了,你传递给delete的指针是不正确的。

另外,return wsk1, wsk2; 并没有按照你的想法做,并不是说你正在使用这些函数的返回值。

【讨论】:

【参考方案2】:

正如轨道中的 Lightness Races 所说,您计算的“旧”指针是错误的。

原则上,当您分配某些东西时(使用newmalloc 或其他方法),最好不要修改“原始指针”。而是制作一个副本,然后继续工作。或者在这种情况下,如果您使用索引变量,您可能会从编译器中获得更好的代码,例如wsk1[i] 而不是 wsk1++ 以达到您想要的目的。

此外,在您的函数中,您尝试重置指针,这是完全没有必要的,因为您正在对本地副本进行操作(但同样,您可以使用 [i] 来代替索引,这将同样感觉,真的)。

【讨论】:

【参考方案3】:

我添加了另一个指针,用于将它们移到桌子的“高度”上,这一切都有效,感谢很多人的建议;)

【讨论】:

以上是关于调试断言失败_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)的主要内容,如果未能解决你的问题,请参考以下文章

C-调试断言失败:_CrtIsValidHeapPointer(block)

堆损坏 - 调试断言失败。在 dbgheap.c 第 1322 行表达式 _crtIsValidHeapPointer(pUserData)

调试断言失败表达式:_pFirstBlock == pHead 使用 OpenCV 和 C++ 尝试调用 SurfFeatureDetector

调试断言失败。 BIG_ALLOCATION_ALLIGNMENT

调试断言失败!表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

调试断言失败 OpenCv is_block_type_valid(header->_block_use)