Delete[] 运算符使 *.exe 触发断点和 wntdll.pdb未加载以显示

Delete[] operator makes *.exe trigger a breakpoint and wntdll.pdb not loaded to appear

本文关键字:pdb wntdll 加载 显示 断点 运算符 exe Delete      更新时间:2023-10-16
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)
}