使用delete调用析构函数时调试错误

时间:2015-07-14 05:34:48

标签: c++ copy-constructor

我有以下代码:

#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;
}

http://i.stack.imgur.com/Pl4Nz.jpg

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

    if (Buffer != NULL)
        delete Buffer;

程序贯穿始终。 那么为什么会这样呢?

2 个答案:

答案 0 :(得分:1)

如果您使用buffer = new char[length]分配内存,则应使用delete[] buffer;

释放内存

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

我也无法编译您的代码(我不使用Windows)但我遇到了strcpy_sstrlen的问题,并且还存在类型转换问题。

答案 1 :(得分:0)

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

应该是:

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

在它出现的每种情况下。

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