CRT 检测到应用程序在 C++ 堆结束后写入内存

CRT Detected that the application wrote to memory after end of heap in C++

我创建了一个 class 的 MyString。我的代码工作得很好,但是当我为我的 class 编写 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] = '[=11=]';
}
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] = '[=11=]';
}
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;
}
length = 0;
str = new char[length];

计算机编程的黄金法则指出:“你的计算机总是完全按照你告诉它做的,而不是你想要它做的”。在这里,这正是您告诉计算机的内容:分配一个 0 字节的数组。换句话说,一个根本不包含任何内容的空数组。换句话说:绝对没有分配任何东西。

str[length] = '[=11=]';

这会将数组中的第一个字节设置为 0。由于未分配任何内容,因此这是未定义的行为,您的内存损坏就在这里。您应该分配 1 个字节而不是 0 个字节。

另一个构造函数有同样的缺陷。由于 '[=12=]' 是一个普通的 char,与任何其他 char,如 'A''0' 没有区别,您的代码必须始终为其分配一个额外的字符, 除了实际文本字符串中的所有其他字符。