调用带有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;
}
https://i.stack.imgur.com/Pl4Nz.jpg 创建两个具有不同char* Buffer的对象。但是,它无法删除缓冲区。如果我注释掉
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指出的问题的补充
相关文章:
- 不命名构造函数和析构函数上的类型错误
- 导致 Seg 错误的 SingleLinkedList 的析构函数
- LINUX 操作系统上的错误:令牌之前预期的构造函数、析构函数或类型转换'('?
- 矢量擦除调用的错误析构函数
- 在析构函数中调用"delete"运算符时"compiler is out of heap space"编译器错误
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 导致堆缓冲区错误的动态分配数组的析构函数
- 非默认析构函数会导致不完整的类型错误
- 析构函数删除错误的元素
- 使用自定义工具集获取动态退出析构函数链接错误 - eh 矢量析构函数
- 使用 boost::thread 运行函子,但析构函数被错误地调用
- 错误 c++ 在令牌之前'('预期的构造函数、析构函数或类型转换
- 错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换.即使我有一个构造函数
- 模板类中的析构函数给出错误
- 在析构函数内取消引用指针时出现分段错误
- 模板化子类析构函数中的隔离错误
- GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
- 获取错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换
- 显式调用类的析构函数时出现错误
- C++析构函数调用了错误的对象