【发布时间】:2014-11-21 16:05:58
【问题描述】:
我正在构建一个 String 类,我想知道是否应该在构造函数和复制构造函数中复制字符,或者只指向与传递的 char* / 复制的 String 对象的 char* 相同的内存地址? 这是我到目前为止写的:
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* 类型。
【问题讨论】:
-
(1) 为什么不使用
std::string? (2) 总是复制; string 应该是一个“值”类。 (3) 您不知道谁拥有传入的指针,也不知道它指向的字符串何时可以被释放。保留指针的副本是不安全的! -
@cdhowie 作业这就是为什么 :) 并且感谢没有想到内存将被释放的情况。
-
@cdhowie 忘了问,在构造函数中传递的参数是 const char*,如果我要创建 const char*,我将无法释放它,因为它不是用内存创建的分配函数,所以它不会被释放不是吗?那么可以保持原样(谈论构造函数)
-
@Tugal.44 这行不通。你总是需要用
new char[](x)分配你的内部缓冲区(当然不要忘记delete []它)。您不能像在其他构造函数中那样将其与简单的指针分配混合使用。 -
您不知道指针的来源,如果您存储了一个被销毁的堆栈对象的地址,然后您尝试读取它呢?
标签: c++ string constructor copy-constructor