我创建了一个 MyString 类。我的代码作业得很好,但是当我为我的类撰写解构式时,它给了我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;
}
uj5u.com热心网友回复:
length = 0;
str = new char[length];
计算机编程的黄金法则指出:“您的计算机始终完全按照您的指示执行操作,而不是您希望它执行的操作”。在这里,这正是您告诉计算机的内容:分配一个 0 字节的阵列。换句话说,一个根本不包含任何内容的空阵列。换句话说:绝对没有分配任何东西。
str[length] = '\0';
这将阵列中的第一个位元组设定为 0。由于没有分配任何内容,这是未定义的行为,并且您的存储器损坏,就在这里。您应该分配 1 个位元组而不是 0 个位元组。
另一个建构式也有同样的缺陷。由于'\0'
是一个普通的char
,与任何其他char
,如'A'
, or没有区别'0'
,因此除了实际文本字符串中的所有其他字符之外,您的代码必须始终为其分配一个额外的字符。
0 评论