c++ - Delete[]操作符使*.exe触发断点出现未加载的wntdll.pdb

标签 c++ delete-operator

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[] 并且您不能将它分配给一个字符*

关于c++ - Delete[]操作符使*.exe触发断点出现未加载的wntdll.pdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43126265/

相关文章:

c++ - 找不到匹配的重载函数 C++ TEMPLATE

c++ - 在控制台窗口关闭时优雅地关闭命令行应用程序(在 Windows 上)

c++ - 分配字符串时 char* new 和 delete [] 错误

c++ - 复制/move 省略与显式删除的复制/move 构造函数

c++ - 获取表达式类型的宏

c++ - 清理cpp中的密码字符串

c++ - 在流畅的界面中避免不必要的模板实例化

c++ - 从动态数组中删除一个动态对象

c++ - 如果不使用 delete,是否会在函数结束时释放内存?

用于删除和重置指针的 C++ 模板函数