我尝试将我自己的字符串类用于学习目的,但我遇到了一个小问题.
我在我的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)
您在创建字符串时在数组边界外写入,因为您没有为空终止符分配空间.它应该是:
str = new char[len + 1];
Run Code Online (Sandbox Code Playgroud)
您还需要确保str由默认构造函数初始化:
String(): str(nullptr) {}
Run Code Online (Sandbox Code Playgroud)
并确保遵循3/5/0规则并创建一个复制构造函数.
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |