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

Kob*_*chi 2 c++

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

我在我的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] = '\0'; // 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.
Run Code Online (Sandbox Code Playgroud)

问题是,为什么会发生这种情况?尝试删除普通的char指针时,我没有收到此错误,以下运行正常,

int main() {
    char *c = new char[2];
    delete[] c;
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*mar 7

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

str = new char[len + 1];
Run Code Online (Sandbox Code Playgroud)

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

String(): str(nullptr) {}
Run Code Online (Sandbox Code Playgroud)

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

  • 另外,你的默认`String()`构造函数没有初始化`str`指针,所以它的值是垃圾.不使用时,需要将`str`初始化为NULL.此外,您缺少复制构造函数和复制赋值运算符来制作`str`数据的深层副本. (2认同)