拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 CRT检测到应用程序在C 堆结束后写入存储器

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

白鹭 - 2022-01-25 2042 0 0

我创建了一个 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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *