删除类中的字符指针会使控制台卡住
deleting a char pointer int a class makes console get stuck
我尝试实现自己的字符串类用于学习目的,但我遇到了一个小问题。
我在我的 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]; 这是索引越界错误
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- C++:将控制台输出存储在宏中更好吗
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 删除类中的字符指针会使控制台卡住
- 学习使用Boost共享指针,控制台输出正确吗
- 控制台在输出指针数组和C++迭代时崩溃