【问题标题】:String class constructor and copy constructor字符串类构造函数和复制构造函数
【发布时间】: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


【解决方案1】:

由于您无法控制指针传递给构造函数的字符串的生命周期,因此依赖它是不安全的。复制字符串。

此外,由于您不知道传递的指针是否为 const,因此丢弃 const 可能会导致未定义的行为。

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2020-05-14
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多