调试断言失败_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】:
这是一个内存损坏错误,发生这种情况是因为你 delete
ing 的东西你没有 new
。
这段代码是错误的:
wsk1 -=29;
wsk2 -=29;
wsk3 -=29;
您有 30 次循环迭代,这意味着对 ++
的三十次调用,意味着您还需要对 -= 30
进行调用。
当你弄错了,你传递给delete
的指针是不正确的。
另外,return wsk1, wsk2;
并没有按照你的想法做,并不是说你正在使用这些函数的返回值。
【讨论】:
【参考方案2】:正如轨道中的 Lightness Races 所说,您计算的“旧”指针是错误的。
原则上,当您分配某些东西时(使用new
、malloc
或其他方法),最好不要修改“原始指针”。而是制作一个副本,然后继续工作。或者在这种情况下,如果您使用索引变量,您可能会从编译器中获得更好的代码,例如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