堆摘要错误不匹配
Mismatched in Heap summary error
我知道我不需要担心仍然可访问的字节,但这种情况不同。
我的文件:wscramble_fio.cpp
// wscramble.cpp
// Word Scramble guessing game
// Illustrates string library functions, character arrays,
// arrays of pointers, etc.
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <string>
#include <fstream>
using namespace std;
// Prototype
void permute(char items[], int len);
// Define an array of strings (since a string is just a char array)
// and since string are just char *'s, we really want an array of char *'s
int main(int argc, char * argv[])
{
if (argc != 2)
{
cout << "Usage : " << argv[0] << "<wordbankFile>" << endl ;
return -1 ;
}
ifstream inputFile ;
inputFile.open(argv[1]);
if (!inputFile.is_open())
{
cout << "Error opening file : " << argv[1] << endl ;
return -1 ;
}
int wordCount = 0 ;
inputFile >> wordCount ;
if (inputFile.fail())
{
cout << "File format incorrect" << endl ;
return -1 ;
}
// Ignore the n following the number.
//inputFile.ignore(1024, 'n') ;
char ** wordBank = new char* [wordCount] ;
char buffer[41] ;
int i = 0 ;
while (!inputFile.eof())
{
inputFile >> buffer ;
//cout << buffer ;
if (strcmp(buffer,"n") == 0 || strcmp(buffer," ") == 0 || strcmp(buffer, "") == 0)
{
continue ;
}
if (i >= wordCount)
{
cout << "Too many words in the file" << endl ;
inputFile.close() ;
return -1 ;
}
wordBank[i] = new char [strlen(buffer)+1] ;
strcpy(wordBank[i],buffer) ;
buffer[0] = ' ' ;
i++ ;
}
for (int i = 0 ; i < wordCount ;i++)
{
cout << wordBank[i] << endl ;
}
srand(time(0));
char guess[80];
bool wordGuessed = false;
int numTurns = 10;
// Pick a random word from the wordBank
int target = rand() % wordCount;
int targetLen = strlen(wordBank[target]);
// More initialization code
char* word = new char[targetLen+1];
strcpy(word, wordBank[target]);
permute(word, targetLen);
// An individual game continues until a word
// is guessed correctly or 10 turns have elapsed
while ( !wordGuessed && numTurns > 0 ){
cout << "nCurrent word: " << word << endl;
cin >> guess;
wordGuessed = (strncmp(guess, wordBank[target], targetLen+1) == 0);
numTurns--;
}
if(wordGuessed){
cout << "You win!" << endl;
}
else {
cout << "Too many turns...You lose!" << endl;
}
/* This would go at the end of program. For now i m just writing here */
for (int i = 0 ; i < wordCount ; i++)
delete (wordBank[i]) ;
delete [] wordBank ;
inputFile.close() ;
}
// Scramble the letters
void permute(char items[], int len)
{
for(int i=len-1; i > 0; --i){
int r = rand() % i;
int temp = items[i];
items[i] = items[r];
items[r] = temp;
}
}
词库.txt
6
cs103 trojan
midterm
aced
perfect
score
当我使用命令时:
valgrind --tool=memcheck --leak-check=yes ./wscramble_fio wordbank.txt
valgrind 命令会产生以下输出。
==10409== Mismatched free() / delete / delete []
==10409== at 0x4C2BADC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10409== by 0x4015D7: main (in /home/simpleguy/CCPP/wscramble_fio)
==10409== Address 0x5a1c550 is 0 bytes inside a block of size 5 alloc'd
==10409== at 0x4C2AFE7: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10409== by 0x401489: main (in /home/simpleguy/CCPP/wscramble_fio)
==10409==
==10409== Mismatched free() / delete / delete []
==10409== at 0x4C2BADC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10409== by 0x401608: main (in /home/simpleguy/CCPP/wscramble_fio)
==10409== Address 0x5a1c370 is 0 bytes inside a block of size 6 alloc'd
==10409== at 0x4C2AFE7: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10409== by 0x40135D: main (in /home/simpleguy/CCPP/wscramble_fio)
==10409==
==10409==
==10409== HEAP SUMMARY:
==10409== in use at exit: 0 bytes in 0 blocks
==10409== total heap usage: 10 allocs, 10 frees, 8,853 bytes allocated
==10409==
==10409== All heap blocks were freed -- no leaks are possible
==10409==
==10409== For counts of detected and suppressed errors, rerun with: -v
==10409== ERROR SUMMARY: 7 errors from 2 contexts (suppressed: 2 from 2)
您应该使用选项"--leak-check=full --show-reachable=yes"在valgrind下重新运行程序,以获取泄漏的完整堆栈跟踪。瓦尔格林德在上述报告中提出了这一点。
$ valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./wscramble_fio wordbank.txt
如果要在 Valgrind 检测到泄漏时由调试器附加,以便可以执行实时调试,则应使用以下命令:
$ valgrind --tool=memcheck --leak-check=yes --db-attach=yes ./wscramble_fio wordbank.txt
这样,每当valgrind遇到错误时,您的程序将自动由GDB附加。
char* word = new char[targetLen+1];
你没有释放它
此删除中还有一个错误:
delete (wordBank[i]);
wordBank[i]
是一个char*
因此正确的语句应如下所示:
delete[] (wordBank[i]);
相关文章:
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 为什么我收到错误:"运算符<<不匹配?
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- 如何摆脱C++中的枚举不匹配错误?
- 为什么此代码编译 (C++11) 而没有类型不匹配错误
- C++ sigc::mem_fun 中的“呼叫不匹配”错误
- C++ lambda 函数中的“运算符=不匹配”错误
- C++,与"运算符="不匹配...错误
- 将构造函数添加到boost.python子类导致参数不匹配错误
- 基本代码中的"运算符=不匹配"错误
- 运算符重载,但仍然"与运算符不匹配"错误
- C++ - 模板 + 'using' 子句 - 参数不匹配错误
- 模板模板参数 - 类型/值不匹配错误
- 新建/删除运算符不匹配错误的严重程度
- c++代码中的参数不匹配错误
- 类型值与向量不匹配错误
- C++ 运算符不匹配<<错误
- LNK2038,迭代器不匹配错误,需要忽略
- QT5迁移和Boost:if.hp:宏参数不匹配错误
- x11 xGetImage不匹配错误