调用带有delete的析构函数时出现错误

Debug Error when invoking destructor with delete

本文关键字:错误 析构函数 delete 调用      更新时间:2023-10-16

我有以下代码:

#include <iostream>
using namespace std;
class MyString {
private:
    char* Buffer;
public:
    MyString(const char* InitialInput){
        if(InitialInput){
            Buffer = new char[strlen(InitialInput + 1)];
            strcpy_s(Buffer, strlen(InitialInput) + 1, InitialInput);
        } else { Buffer = NULL; }
    }
    ~MyString(){ if(Buffer){ delete Buffer; } }
    int GetLength(){ return strlen(Buffer); }
    const char* GetString() { return Buffer; }
};
void UseMyString(MyString const& Input) {
    cout << "String buffer in MyString is " << Input.GetLength() << " characters long." << endl;
    cout << "Buffer contains: " << Input.GetString() << endl;
}
int main(){
    MyString SayHello("Hello from String Class");
    UseMyString(SayHello);
    return 0;
}
https://i.stack.imgur.com/Pl4Nz.jpg

创建两个具有不同char* Buffer的对象。但是,它无法删除缓冲区。如果我注释掉

    if (Buffer != NULL)
        delete Buffer;

程序运行完毕。为什么会这样呢?

如果你用buffer = new char[length]分配内存,你应该用delete[] buffer;释放内存

但是你的代码中还有其他问题。为什么你不想简单地使用std::string ?这肯定会更有效率。

我也不能编译你的代码(我不使用windows),但我有strcpy_sstrlen的问题,也有类型转换的问题。

Buffer = new char[strlen(CopySource.Buffer + 1)];
应:

Buffer = new char[strlen(CopySource.Buffer) + 1]; 

在它出现的每一个例子中。

这是对@PinkFloyd指出的问题的补充