使用 delete 调用析构函数时出现调试错误
Debug Error when invoking destructor with delete
我有以下代码:
#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* 缓冲区的对象。
但是,它无法删除缓冲区。
如果我注释掉
if (Buffer != NULL)
delete Buffer;
程序运行通过。
那为什么会这样呢?
如果您使用 buffer = new char[length]
分配内存,您应该使用 delete[] buffer;
释放内存
但是你的代码还有其他问题。你为什么不想简单地使用 std::string
?肯定会更有效率...
我也无法编译您的代码(我不使用 windows),但我在 strcpy_s
和 strlen
方面存在问题,并且在类型转换方面也存在问题。
Buffer = new char[strlen(CopySource.Buffer + 1)];
应该是:
Buffer = new char[strlen(CopySource.Buffer) + 1];
在每一个出现的地方。
这是@PinkFloyd 指出的问题的补充。
我有以下代码:
#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* 缓冲区的对象。 但是,它无法删除缓冲区。 如果我注释掉
if (Buffer != NULL)
delete Buffer;
程序运行通过。 那为什么会这样呢?
如果您使用 buffer = new char[length]
分配内存,您应该使用 delete[] buffer;
但是你的代码还有其他问题。你为什么不想简单地使用 std::string
?肯定会更有效率...
我也无法编译您的代码(我不使用 windows),但我在 strcpy_s
和 strlen
方面存在问题,并且在类型转换方面也存在问题。
Buffer = new char[strlen(CopySource.Buffer + 1)];
应该是:
Buffer = new char[strlen(CopySource.Buffer) + 1];
在每一个出现的地方。
这是@PinkFloyd 指出的问题的补充。