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
}
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*
。
fName = "e:/fc/enc_test.txt";
会导致fName
指向字符串文本"e:/fc/enc_test.txt"
的存储位置。然后,您尝试删除未分配new
的位置。您需要使用 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)
}
相关文章:
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 加载"D:UsersPublicDocumentsopencvbuildx64vc14binopencv_world340d.dll",找不到或打开PDB文件
- OpenCV 3 Visual Studio 2017 调试,调用堆栈没有.pdb文件
- 删除编译器优化并在发布中启用 pdb 文件
- pdb 不匹配或未找到 - 在窗口中调试
- 在Visual Studio中加载wxWidget pdb库
- 在不中断引用的情况下移动静态库的 *.pdb 文件 - LNK4099
- C++ 未从同一目录加载的 PDB 符号
- PDB 与.exe不匹配
- 使用“ .reload”迫使windbg加载PDB
- 如何修复Visual Studio 2017中的"Cannot find or open the PDB file."
- Delete[] 运算符使 *.exe 触发断点和 wntdll.pdb未加载以显示
- 将PCH,PDB和Zi组合在一起会导致VS2017的C2859编译错误令人费解
- C++ ATIOGLXX.pdb 包含查找模块 ATIOGLXX.dll 源代码所需的调试信息
- 从远程服务器请求PDB文件
- 截至2017年,Clang 5.0 PDB支持
- nvoglv32.dll 找不到或打开 PDB 文件
- 是否可以使用IDiaDataSource::LoadDataFromPdb从符号存储中读取pdb
- 如何将信息插入 pdb 文件
- 如何让CMAKE安装目标PDB文件