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" 的位置。然后您尝试删除未分配给 newthat 位置。您需要使用 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*