c++ 类函数代码return后调用了析构函数,但我没有delete那对象

PrincessLink~ 2019-03-19 10:17:31
代码如下:
void BerryMath::AST::parse() {
if (root) delete root;
root = new ASTNode(ROOT, "root");
lex lexer(code);
lex::lexToken t;
lex::lexToken unknown;// 存储目前未知的token
lex::lexToken tmp;// 存储中间token
unknown.token = NONE_TOKEN;
bool expression = false;
// ASTNode *now;
// now = root;
bool first = true;
int s = lexer.parseIndex;
// std::cout << "=====" << code << "=====" << std::endl;
while (true) {
t = lexer.get();
if (t.token == IF_TOKEN) {
int bracketsCount(0);// 首先存储小括号次数
lex::lexToken op_t;
bool exitLoop(false);
string expression("");
do {
op_t = lexer.get();
if (op_t.str == "(") bracketsCount++;
if (op_t.str == ")") bracketsCount--;
expression += op_t.str;
if (op_t.token == END_TOKEN && bracketsCount != 0) {
root->str = "bad-tree";
exitLoop = true;
break;
}
} while (bracketsCount != 0);
std::cout << expression << std::endl;
if (exitLoop) break;
string then("");// 存储接下来的语句
bracketsCount = 0;// 存储大括号次数
exitLoop = false;
bool noBrackets = true;
do {
if (code[lexer.parseIndex] == '{') {
if (bracketsCount > 1) then += code[lexer.parseIndex];
bracketsCount++;
noBrackets = false;
} else if (code[lexer.parseIndex] == '}') {
if (bracketsCount > 1) then += code[lexer.parseIndex];
bracketsCount--;
noBrackets = false;
} else {
then += code[lexer.parseIndex];
}
lexer.parseIndex++;
} while ((noBrackets || bracketsCount != 0) && lexer.parseIndex < code.length());
// if (exitLoop) break;
AST expressionAST(expression);
expressionAST.parse();
root->push(OPERATOR, "if");
root->at(-1)->push(expressionAST.value()->at(0));
root->at(-1)->push(VALUE, then);
std::cout << "abc" << std::endl;
return;// *发生错误的地方
}
if (t.token == FOR_TOKEN) {
std::cout << "for token" << std::endl;
}
if (t.token == END_TOKEN) {
if (unknown.token != NONE_TOKEN) {
// std::cerr << BOLDRED << "SyntaxError: Unexpected token '" << unknown.str << "'." << RESET << std::endl;
root->str = "bad-tree";
break;
} else {
break;
}
}
if (first) {
// std::cout << t.str << ": " << (t.token == UNKNOWN_TOKEN) << std::endl;
if (!(t.token > SELF_SUB_TOKEN && t.token < INIT_TOKEN)) {// 是表达式
expression = true;
}
first = false;
}
// std::cout << t.token << ", " << t.str << std::endl;
if (expression) {
// std::cout << "123" << std::endl;
string left("");
string right("");
int base = 1;
short minPri(15);
int minOpIndex(-1);
long tokenLen(0);
string minOp("");
lex::lexToken op_t;
op_t.token = INIT_TOKEN;
while (op_t.token != END_TOKEN) {
op_t = lexer.get();
if (op_t.token > VARIABLE_TOKEN && op_t.token < MINUS_TOKEN) {// 是符号
short pri = priority(op_t.str);
if (op_t.str == "(") {
base *= pri;
} else if (op_t.str == ")") {
base /= pri;
} else if (pri != 13) {
pri *= base;
if (!isNumber(op_t.str) && pri < minPri && op_t.str != "(" && op_t.str != ")") {
// std::cout << op_t.str << std::endl;
minOpIndex = lexer.parseIndex;
minOp = op_t.str;
minPri = pri;
tokenLen = op_t.str.length();
}
}
}
}
// std::cout << minOpIndex << std::endl;
if (minOpIndex == -1) {// 说明没有符号
lexer.parseIndex = s;
auto n = lexer.get();
// std::cout << n.str << std::endl;
// int countXX(0);
while (n.str == "(" || n.str == ")") {
n = lexer.get();
// countXX++;
}
n.str = trim(n.str);
if (priority(n.str) == 13) {// ++, --, !, ~
root->push(OPERATOR, n.str);
// n = lexer.get();
int bracketsCount(0);
string then("");
for (int i = lexer.parseIndex; i < code.length(); i++) {
if (code[i] == '(') bracketsCount++;
if (code[i] == ')') bracketsCount--;
then += code[i];
}
if (bracketsCount < 0) {
for (int i = bracketsCount; i < 0; i++) {
then = "(" + then;
}
} else {
for (int i = 0; i < bracketsCount; i++) {
then += ")";
}
}
auto ast = new AST(then);
ast->parse();
root->at(-1)->push(ast->root->at(-1));
// std::cout << "tmp" << std::endl;
} else {
root->push(VALUE, n.str);
// root->at(-1)->push(ast->root->at(-1));
}
break;
}
// std::cout << minOpIndex << ", " << minPri << ", " << minOp << std::endl;
minOpIndex--;
// std::cout << (minOp == "=") << std::endl;
root->push(OPERATOR, minOp);

int bracketsCount(0);
for (int i = s; i < minOpIndex - tokenLen + 1; i++) {
if (code[i] == '(') bracketsCount++;
if (code[i] == ')') bracketsCount--;
left += code[i];
}
// std::cout << "bracketsCountLeft: " << bracketsCount << std::endl;
if (bracketsCount > 0) {
for (int i = 0; i < bracketsCount; i++) {
left += ")";
}
} else {
for (int i = bracketsCount; i < 0; i++) {
left = "(" + left;
}
}
// std::cout << left << std::endl;
bracketsCount = 0;
for (int i = minOpIndex + 1; i < code.length(); i++) {
if (code[i] == '(') bracketsCount++;
if (code[i] == ')') bracketsCount--;
right += code[i];
}
// std::cout << "bracketsCountRight: " << bracketsCount << std::endl;
if (bracketsCount > 0) {
for (int i = 0; i < bracketsCount; i++) {
right += ")";
}
} else {
for (int i = bracketsCount; i < 0; i++) {
right = "(" + right;
}
}
// std::cout << right << std::endl;
bracketsCount = 0;
// std::cout << left << minOp << right << std::endl;
auto leftAST = new AST(left);
auto rightAST = new AST(right);
leftAST->parse();
rightAST->parse();
if (
leftAST->value()->value() == "bad-tree"
|| rightAST->value()->value() == "bad-tree"
) {
root->str = "bad-tree";
break;
}
// std::cout << code << std::endl;
// std::cout << left << std::endl;
// std::cout << right << std::endl;
root->at(-1)->push(leftAST->root->at(-1));
root->at(-1)->push(rightAST->root->at(-1));
continue;
}
}
if (code.length() >= 20)
std::cout << "abc" << std::endl;
// root->each([](ASTNode* n) {
// std::cout << BOLDMAGENTA << n->str << ", " << n->t << RESET << std::endl;
// });
// std::cout << BOLDCYAN << "[SystemInfo] Build AST finish." << RESET << std::endl;
}

发生错误的地方我已经使用“*发生错误的地方”标明
求解决!!!
...全文
210 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztenv 版主 2019-03-21
  • 打赏
  • 举报
回复
在析构函数里打打日志看看
PrincessLink~ 2019-03-20
  • 打赏
  • 举报
回复
引用 1 楼 Slzde_sub 的回复:
你的意思是你不期望root被析构掉是吗? 没有显式的调用delete , 是不会调用析构函数的,你可以看一下是否是你破坏了root占用的堆空间导致的
那么该如何查看是什么原因破坏了堆空间呢?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧