【问题标题】:C++ pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug未分配被释放的 C++ 指针 *** 在 malloc_error_break 中设置断点以进行调试
【发布时间】:2018-07-29 09:13:15
【问题描述】:

我不断收到此错误。我知道是什么功能导致它,但不知道如何修复它。从这个post在线查找说:

您需要传递一个指向动态分配对象的指针,或者在您的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;
}

【问题讨论】:

  • 指针是无用的,因为你复制它指向的字符串并且不再使用指针。
  • 剪掉闲聊的素材后,你的标题是“C++ 指针被释放没有被分配 *** 在 malloc_error_break 中设置断点来调试”。这是一条错误消息吗?哪里来的?

标签: c++11 pointers reference pass-by-reference pass-by-pointer


【解决方案1】:

让我们突出显示您显示的几行代码

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

您将成员变量root 声明为指针。

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

在上面你让curr指向root指向的地方。

但是你永远不会让root指向任何地方! MWT::root 变量未初始化,将有一个indeterminate 值。在没有初始化的情况下以任何方式使用这个指针都会导致undefined behavior

是的,您使用此指针,因为您在 MWT::insert 函数中取消引用 curr

有点不清楚你在做什么(对我来说),但你需要确保root(因此curr)是一个有效的指针,然后再尝试取消引用它。

【讨论】:

  • 我正在尝试使用 unordered_map 实现多路 trie,所以我创建了一个 MWTNode 类和 MWT 类。然后试图通过调用它的惰性来创建一个 MWT?哪一部分不清楚,如果您建议一种不同的方法来做到这一点,请告诉我?
猜你喜欢
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 2023-03-29
  • 2013-02-19
  • 2012-11-06
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多