Delete[]操作符使*.exe触发断点和wntdll.pdb未加载出现
Delete[] operator makes *.exe trigger a breakpoint and wntdll.pdb not loaded to appear
Delete[]fName
in decode()
导致此错误,delete
in encode()
工作正常。如果没有那个 delete
,每次新调用 decode()
都会导致多浪费 1 MB,这是预料之中的,购买为什么添加 delete
会导致崩溃,但不会导致 encode()
崩溃? MAX_STRING_LENGTH
常量是 1048576
(1 MB 字符)
void encode()
{
char* usrChars = new char[MAX_STRING_LENGTH];
memset(usrChars, 0, MAX_STRING_LENGTH);
cin.get();
cin.getline(usrChars, MAX_STRING_LENGTH);
ofstream f("E:/fc/enc_test.txt");
//do stuff
f.close();
delete[]usrChars; //works fine
decode();
cout << endl;
}
void decode()
{
char* fName = new char[MAX_STRING_LENGTH];
memset(fName, 0, MAX_STRING_LENGTH);
fName = "e:/fc/enc_test.txt";
ifstream f(fName);
delete[]fName; //causes crash
//do stuff
}
fName = "e:/fc/enc_test.txt";
导致 fName
指向存储字符串文字 "e:/fc/enc_test.txt"
的位置。然后您尝试删除未分配给 new
的 that 位置。您需要使用 std::strcpy
来复制一个 c 字符串。您可以通过使用 std::string
来避免很多麻烦。
#include <string>
#include <fstream>
void decode()
{
std::string fName = "e:/fc/enc_test.txt";
std::ifstream f(fName);
// do stuff (no delete required for fName)
}
decode
崩溃而 encode
没有崩溃的原因是因为您正试图删除一个未分配给 new
的指针。您确实以 new
开始分配,但是当您执行 fName = "e:/fc/enc_test.txt";
时,您将 fname
更改为指向字符串文字而不是您最初分配的内存。在那之后试图删除它就是你崩溃的原因。
您应该将编译器上的警告设置为
fName = "e:/fc/enc_test.txt";
应该是一个错误,因为 "e:/fc/enc_test.txt"
的类型是 const char[]
,您不能将它分配给 char*
。
Delete[]fName
in decode()
导致此错误,delete
in encode()
工作正常。如果没有那个 delete
,每次新调用 decode()
都会导致多浪费 1 MB,这是预料之中的,购买为什么添加 delete
会导致崩溃,但不会导致 encode()
崩溃? MAX_STRING_LENGTH
常量是 1048576
(1 MB 字符)
void encode()
{
char* usrChars = new char[MAX_STRING_LENGTH];
memset(usrChars, 0, MAX_STRING_LENGTH);
cin.get();
cin.getline(usrChars, MAX_STRING_LENGTH);
ofstream f("E:/fc/enc_test.txt");
//do stuff
f.close();
delete[]usrChars; //works fine
decode();
cout << endl;
}
void decode()
{
char* fName = new char[MAX_STRING_LENGTH];
memset(fName, 0, MAX_STRING_LENGTH);
fName = "e:/fc/enc_test.txt";
ifstream f(fName);
delete[]fName; //causes crash
//do stuff
}
fName = "e:/fc/enc_test.txt";
导致 fName
指向存储字符串文字 "e:/fc/enc_test.txt"
的位置。然后您尝试删除未分配给 new
的 that 位置。您需要使用 std::strcpy
来复制一个 c 字符串。您可以通过使用 std::string
来避免很多麻烦。
#include <string>
#include <fstream>
void decode()
{
std::string fName = "e:/fc/enc_test.txt";
std::ifstream f(fName);
// do stuff (no delete required for fName)
}
decode
崩溃而 encode
没有崩溃的原因是因为您正试图删除一个未分配给 new
的指针。您确实以 new
开始分配,但是当您执行 fName = "e:/fc/enc_test.txt";
时,您将 fname
更改为指向字符串文字而不是您最初分配的内存。在那之后试图删除它就是你崩溃的原因。
您应该将编译器上的警告设置为
fName = "e:/fc/enc_test.txt";
应该是一个错误,因为 "e:/fc/enc_test.txt"
的类型是 const char[]
,您不能将它分配给 char*
。