我創建了一個 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',因此除了實際文本字串中的所有其他字符之外,您的代碼必須始終為其分配一個額外的字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/394533.html
上一篇:C中的指標練習
下一篇:為什么指標在C中列印兩次?
