diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index c35665aca..9fbee0a64 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -417,7 +417,7 @@ bool CheckLeakAutoVar::checkScope(const Token * const startToken, changeAllocStatusIfRealloc(alloctype, fTok, varTok); } else if (mTokenizer->isCPP() && Token::Match(varTok->tokAt(2), "new !!(")) { const Token* tok2 = varTok->tokAt(2)->astOperand1(); - const bool arrayNew = (tok2 && (tok2->str() == "[" || (tok2->str() == "(" && tok2->astOperand1() && tok2->astOperand1()->str() == "["))); + const bool arrayNew = (tok2 && (tok2->str() == "[" || (Token::Match(tok2, "(|{") && tok2->astOperand1() && tok2->astOperand1()->str() == "["))); VarInfo::AllocInfo& varAlloc = alloctype[varTok->varId()]; varAlloc.type = arrayNew ? NEW_ARRAY : NEW; varAlloc.status = VarInfo::ALLOC; diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index 7560c2b08..85ce36111 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -2101,6 +2101,12 @@ private: " }\n" "}\n", true); ASSERT_EQUALS("", errout.str()); + + check("void f(int i) {\n" + " int* a = new int[i] {};\n" + " delete[] a;\n" + "}\n", /*cpp*/ true); + ASSERT_EQUALS("", errout.str()); } void smartPointerDeleter() {