_CrtIsValidHeapPointer(pUserdata) AND _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) [重复]
Posted
技术标签:
【中文标题】_CrtIsValidHeapPointer(pUserdata) AND _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) [重复]【英文标题】:_CrtIsValidHeapPointer(pUserdata) AND _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) [duplicate] 【发布时间】:2012-05-26 03:36:52 【问题描述】:可能重复:What is The Rule of Three?
我刚刚“完成”了我的 AVL 树实现,并开始测试以前使用普通二叉搜索树的效果。但是现在当调用 bsTree 构造函数时,我得到了这些断言错误。
_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 是第一个,如果我继续 Windows 会吐出下一个。 _CrtIsValidHeapPointer(pUserdata)
TYPE 在 type.h 中定义为 Signal* 我计划将其更改为使用模板或其他用于多态实现的东西,但这对于初始设置来说似乎很简单。
主要执行:
#include<string>
#include<iostream>
#include<fstream>
#include"binSearchTree.h"
;
using namespace std;
int main()
string word;
int i = 0;
ifstream book ("AV1611Bible.txt");
if(book.is_open())
book >> word;
bsTree* tree = new bsTree(new Signal(word));
while( book.good())
book >> word;
tree->addValue(new Signal(word));
//cout << word;
cout << i++ << "\n";
book.close();
return 0;
bsTree 构造函数:
#include"binSearchTree.h"
;
using namespace std;
bsTree::bsTree()
root = new Node();
size = 0;
bsTree::bsTree(TYPE v)
root = new Node(v);
size = 0;
bsTree::~bsTree()
delete root;
信号构造函数:
#include"signal.h"
using namespace std;
Signal::Signal()
signal = "";
count = 0;
prob = 0;
Signal::Signal(string s)
Signal(s,0);
Signal::Signal(string s, double p)
signal = s;
count = 0;
prob = p;
Signal::Signal(string s, int n, double p)
signal = s;
count = n;
prob = p;
Signal::~Signal()
delete(&signal);
delete(&count);
delete(&prob);
【问题讨论】:
除了missing copy ctor and copy assignment operator,这段代码还有很多错误...首先,停止using namespace std;
。其次,不要new
一切,这不是Java或C#。第三,永远不要delete
非指针! (您没有显示标题,但我很确定 signal
、count
和 prob
是 not 指针。第四,使用 smart pointers if 你必须使用动态分配(和use the right one)。
你也没有显示Node
的定义,我几乎可以看出也不遵守三规则。
关于命名空间,我没有到处都有它们,然后 Visual Studio 抱怨了。当我把它们放进去时就停下来了。我在发布后不久就发现了问题。 XEO 是对的,我的解构器导致了删除问题。我会研究三法则。我最初是在 java 上学习的,并且没有接受过任何 C++ 的正式培训。只是想感受一下。
有没有办法将 Xeo 的评论标记为答案?下面的选项似乎并不完全正确。
【参考方案1】:
上面显示的代码有未定义的行为,例如delete
未分配 new
,然后任何事情都可能发生,包括你看到的任何行为(你忘了描述)
【讨论】:
【参考方案2】:Xeo 是正确的。析构函数正在访问它无权访问的内存。
【讨论】:
以上是关于_CrtIsValidHeapPointer(pUserdata) AND _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) [重复]的主要内容,如果未能解决你的问题,请参考以下文章
C-调试断言失败:_CrtIsValidHeapPointer(block)
OpenCV 与 std::vector 不兼容? (_crtIsValidHeapPointer 错误)
_CrtIsValidHeapPointer(pUserdata) AND _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) [重复]
堆损坏 - 调试断言失败。在 dbgheap.c 第 1322 行表达式 _crtIsValidHeapPointer(pUserData)