_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 非指针! (您没有显示标题,但我很确定 signalcountprobnot 指针。第四,使用 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) [重复]的主要内容,如果未能解决你的问题,请参考以下文章

_CrtIsValidHeapPointer 错误

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

OpenCV 与 std::vector 不兼容? (_crtIsValidHeapPointer 错误)

_CrtIsValidHeapPointer(pUserdata) AND _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) [重复]

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

C++入门——指针与数组——Expression: _CrtIsValidHeapPointer(Block)