Освобожденный указатель C++ не был выделен *** установите точку останова в malloc_error_break для отладки

Я продолжаю получать эту ошибку. Я знаю, какая функция вызывает это, но не знаю, как это исправить. Глядя в Интернете из этого поста, говоря:

Вам нужно передать указатель на динамически размещенный объект или сделать свой собственный insde для вашего класса chainLink.

Однако, как я пытаюсь передать указатель строки. ошибка все еще выскакивает. Вот мой код

#include <iostream>
#include "MWTNode.h"
#include "MWT.h"
using namespace std;

int main() {
MWT t;
string str ="abc";
string* strPtr = &str;
t.insert(strPtr);
std::cout << "Hello, World!" << std::endl;
return 0;
}


#include "MWTNode.h"
class MWT {
public:
MWTNode *root;
string find(const string &);
void insert(const string* string);

};
void MWT::insert(const string* word) {
MWTNode* curr = root;
MWTNode newNode;
string w = *word;
for (int i = 0; i < word->length(); i++) {
    const char c = w[i];
    if (curr->children.find(c) == curr->children.end()){

        //curr->children[c]= MWTNode();
        //node->frequency=node->frequency+1;
    }
    curr = &(curr->children[c]);
}
curr->flag = true;
}



#include <unordered_map>
#include <vector>
#include <string>
#include <sstream>
#include <set>
using namespace std;

class MWTNode {
public:
unordered_map<char, MWTNode> children;
string value;
bool flag;
int frequency;

MWTNode(const string &);
MWTNode(const char c);
MWTNode();
void setFrequency ();
int getFrequency ();

};


MWTNode::MWTNode(const string &val) {
value = val;
flag = false;
frequency = 0;
}

MWTNode::MWTNode(const char c) {
value =c;
flag = false;
frequency = 0;
}

MWTNode::MWTNode() {
value ="";
flag = false;
frequency = 0;
}

1 ответ

Давайте выделим несколько строк кода, который вы показываете

class MWT {
public:
MWTNode *root;
// ...
};

В том, что вы объявляете переменную-член root в качестве указателя.

void MWT::insert(const string* word) {
MWTNode* curr = root;
// ...
}

Выше вы делаете curr указать, где root указывает.

Но вы никогда не делаете root указать куда угодно! MWT::root переменная неинициализирована и будет иметь неопределенное значение. Любое использование этого указателя без инициализации приведет к неопределенному поведению.

И да, вы используете этот указатель, как вы разыменования curr внутри MWT::insert функция.

Немного неясно, что вы делаете (для меня), но вы должны убедиться, что root (и поэтому curr) является допустимым указателем, прежде чем пытаться разыменовать его.

Другие вопросы по тегам