【发布时间】:2020-04-06 20:00:49
【问题描述】:
所以我试图实现 String 类,但我收到一个错误,说分段错误。我认为我的构造函数中存在内存泄漏。你能告诉我我做错了什么吗?谢谢。
这是构造函数代码,我不能使用任何标准库功能。
String(const char* chars){
int i = 0;
if(chars){
while(chars[i]){
i++;
}
}
len = i;
str = new char[len - 1];
for(int j = 0; j < len; j++){
str[j] = chars[j];
}
};
这也是我的完整代码:
#include <iostream>
using namespace std;
class String{
public:
char* str;
int len;
String(){
str = new char[0];
len = 0;
};
String(const char* chars){
int i = 0;
if(chars){
while(chars[i]){
i++;
}
}
len = i;
str = new char[len - 1];
for(int j = 0; j < len; j++){
str[j] = chars[j];
}
};
String(const String& s){
if(s.isEmpty() == false){
len = s.len;
str = new char[len];
for(int i = 0; i < len; i++){
str[i] = s.str[i];
}
}
};
~String() noexcept{
if(len > 0)
delete[] str;
};
bool isEmpty() const noexcept{
if(len == 0){
return true;
}
else{
return false;
}
}
unsigned int length() const noexcept{
return len;
}
const char* toChars() const noexcept{
char* temp = new char[len];
int c = 0;
while(temp[c] != '\0'){
temp[c] = str[c];
c++;
}
return temp;
}
};
int main()
{
const char* chars = "Boo is snoring";
String s;
String t{chars};
cout << "t.len : " << t.length() << endl << "toChar() : " << t.toChars() << endl;
return 0;
}
【问题讨论】:
-
您是否打算在表达式
+中使用str = new char[len - 1];?您不会复制终止零字符。 -
您的代码中有几个缺陷——其中一个是您没有在复制构造函数中设置所有成员变量。您不应该关心传入的字符串是否为空,您应该制作一个副本。此外,您还缺少用户定义的赋值运算符。