字符串类的构造函数和复制构造函数
问题描述:
我正在构建一个String类,我想知道如果在构造函数和复制构造函数中我应该复制字符或只是指向相同的内存地址作为传递的char */char复制的String对象的* 这是我写到目前为止:字符串类的构造函数和复制构造函数
String::String(const char* pch)
{
str = const_cast<char*>(pch);
length = getLen();
}
String::String(const String& that)
{
length = that.length;
str = new char[length];
for (unsigned int i = 0; i < length; i++)
{
str[i] = that.str[i];
}
}
在我只是指向相同的地址为const char *构造函数中,我应该把它作为或每个字符复制到新分配的内存块?如果我要改变字符串,我会分配一个新的内存块,所以char *是const不是什么大问题(我认为)。在复制构造函数中,我将每个字符复制到新分配的内存空间,但我不确定是否有必要,因为如果稍后更改字符串,将为正在更改的对象分配新的内存块,而使其他对象相同指针不变。想要听取您的意见。 “str”是char *类型。
答
由于您无法控制其指针传递给构造函数的字符串的生存期,因此依赖它是不安全的。制作字符串的副本。
此外,由于您不知道传递的指针是否为const
,因此如果这样抛出常量可能会导致未定义的行为。
(1)为什么不使用'std :: string'? (2)总是复制;字符串应该是一个“值”类。 (3)你不知道谁拥有传入的指针,也不知道它指向的字符串何时可以被释放。这是**不安全**保留指针的副本! – cdhowie 2014-09-26 15:31:36
@cdhowie家庭作业这就是为什么:)谢谢没有想到的情况下,内存将被释放。 – 2014-09-26 15:39:09
@cdhowie忘了问,在构造函数中传递的参数是const char *,如果我要创建const char *我不能释放它,因为它没有使用内存分配函数创建,所以它不会被释放否?所以它可以保持原样(谈论构造函数) – 2014-09-26 15:42:56