【发布时间】:2021-12-26 12:44:48
【问题描述】:
我创建了一个 MyString 类。我的代码工作得很好,但是当我为我的类编写 destructor 时,它在 delete 关键字处给了我错误。请帮助我找出问题所在以及解决方案。
MyString 头文件
#pragma once
#ifndef MYSTRING_H
#define MYSTRING_H
class MyString
{
private:
char* str;
int length;
public:
MyString();
MyString(const char*);
~MyString();
};
#endif
MyString CPP 文件
#include "MyString.h"
#include <iostream>
using namespace std;
MyString::MyString() {
length = 0;
str = new char[length];
str[length] = '\0';
}
MyString::MyString(const char* cString) {
length=strlen(cString);
str = new char[length];
for (int i = 0; i < length; i++)
str[i] = cString[i];
str[length] = '\0';
}
MyString::~MyString() {
delete[] str;
str = nullptr;
length = 0;
}
主 CPP 文件
#include "MyString.h"
#include <iostream>
using namespace std;
int main() {
//MyString s1;
MyString s2("OOP is Fun!!");
char name[15] = "Pakistan";
MyString s3(name);
return 0;
}
【问题讨论】:
-
str[length] = '\0';:str指向的数组有多大,其中最大的索引是多少?此外,您的班级违反了rule of zero/three/five。 -
构造器没有问题,工作正常。
-
不,构造函数是错误的。析构函数很好,虽然
delete[] str;之后的两行没有意义。 -
我已经修改了构造函数,但仍然遇到同样的问题。
MyString::MyString() { length = 0; str = new char[10]; str[0] ='a'; str[1] = '\0'; } -
正是这个错误。谢谢老兄!
标签: c++ pointers memory-management heap-memory delete-operator