【问题标题】:CRT Detected that the application wrote to memory after end of heap in C++CRT 检测到应用程序在 C++ 中堆结束后写入内存
【发布时间】: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


【解决方案1】:
length = 0;
str = new char[length];

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

str[length] = '\0';

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

另一个构造函数也有同样的缺陷。由于'\0' 是一个普通的char,与任何其他char 没有什么不同,例如'A' 或'0',除了实际中的所有其他字符之外,您的代码必须始终为其分配一个额外的字符文本字符串。

【讨论】:

  • 我已经修改了我的构造函数,但仍然给我同样的错误MyString::MyString() { length = 0; str = new char[10]; str[0] ='a'; str[1] = '\0'; }
  • 您是否还阅读了我的回答部分,其中提到了另一个构造函数也被破坏的事实,同样的方式,并且也必须得到修复?
猜你喜欢
  • 1970-01-01
  • 2018-04-03
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多