2012-05-26 2 views
-2

Можно создать дубликат:
What is The Rule of Three?_CrtIsValidHeapPointer (pUserdata) И _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)

Я просто "закончил" моя реализация AVL дерева и пошел, чтобы проверить, что ранее работал с обычное двоичное дерево поиска. Но теперь я получаю эти ошибки утверждения, когда вызывается конструктор bsTree.

_BLOCK_TYPE_IS_VALID (pHead-> nBlockUse) является первым, и если я продолжу, окна выплюнут следующий. _CrtIsValidHeapPointer (pUserdata)

TYPE определяется в type.h качестве сигнала * Я планирую изменить это использовать шаблоны или что для полиморфной реализации, но это казалось простым для начальной настройки.

Основной выполнение:

#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); 
} 
+0

Помимо [отсутствующего экземпляра ctor и оператора присваивания копий] (http://stackoverflow.com/q/4172722), в этом коде есть так много * неправильных ... Сначала остановите ['using namespace std ; '] (http://stackoverflow.com/q/1452721). Во-вторых, не 'новый' все, это не Java или C#. В-третьих, никогда не удаляйте ненужные указатели! (Вы не показывали заголовок, но я уверен, что 'signal',' count' и 'prob' являются указателями * not *. В-четвертых, используйте [умные указатели] (http://stackoverflow.com/q/ 106508) * если * вы должны использовать динамическое распределение (и [использовать правильный вариант] (http://stackoverflow.com/q/8706192)). – Xeo

+0

Вы также не указали определение 'Node', которое я может почти видеть также не соблюдение правила из трех. – Xeo

+0

О пространстве имен, у меня их не было везде, а затем Visual Studio жаловалась. И остановилась, когда я их вставлял. Я выяснил проблему спустя некоторое время после того, как я опубликовал. правый, мой деконструктор вызвал проблему с удалением. Я рассмотрю правило из трех. Я изначально узнал о java и не имел никакого формального обучения с C++. Просто пытаюсь понять, что происходит. – ProdigousRanger

ответ

-4

Xeo было правильным. Деструкторы получили доступ к памяти, к которой у нее не было доступа.

0

Код, приведенный выше, имеет Неопределенное поведение, из-за, например, delete чего-то, что не было выделено с new, а затем ничего может произойти, в том числе то, что поведение это то, что вы видите (что вы забыли описать)

Смежные вопросы