删除类中的字符指针会使控制台卡住

deleting a char pointer int a class makes console get stuck

本文关键字:控制台 指针 字符 删除      更新时间:2023-10-16

我尝试实现自己的字符串类用于学习目的,但我遇到了一个小问题。

我在我的 String 类中创建了一个 char 指针成员(并在构造函数中分配了它(。我还在解构器中删除了 [],我注意到控制台在尝试退出 main 方法后卡住了。

#include <iostream>
class String {
char *str;
public:
String() {}
String(const char *s) {
size_t len = strlen(s);
str = new char[len];
for (size_t i = 0; i < len; i++)
str[i] = s[i];
str[len] = ''; // null terminate
}
~String() { delete[] str; }
};
int main() {
String s("12");
} // <-- Program gets stuck here while trying to exit. Notice that when
// I remove the delete[] in the deconstructor, the program runs fine.

问题是,为什么会这样?我在尝试删除普通字符指针时没有收到此错误,以下内容运行良好,

int main() {
char *c = new char[2];
delete[] c;
}

创建字符串时,您正在数组边界之外写入,因为您没有为 null 终止符分配空间。它应该是:

str = new char[len + 1];

您还需要确保str由默认构造函数初始化:

String(): str(nullptr) {}

并确保遵循 3/5/0 规则并创建一个复制构造函数。

分配len个字符

str = new char[len];

str[len]len+1性格。你越界了,发生了某种未定义的行为。

这是因为数组索引从 0 开始到分配的大小 1 例如,str=new char[len] 将从 str[0] 到 str[len-1] 所以,它应该是 str=new char[len+1]; 这是索引越界错误