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'
没有区别,您的代码必须始终为其分配一个额外的字符, 除了实际文本字符串中的所有其他字符。
我创建了一个 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'
没有区别,您的代码必须始终为其分配一个额外的字符, 除了实际文本字符串中的所有其他字符。