gpt4 book ai didi

c++ - 'new' 的字符串分配问题

转载 作者:太空宇宙 更新时间:2023-11-04 14:58:22 25 4
gpt4 key购买 nike

如有疑问,请转向 Stackoverflow...

我在字符串分配方面遇到了问题。我的目标是存储传递的带引号的字符串的 n 长度。我检查 m_p 是否为空,因为我认为在 Debug模式下 MS 喜欢将地址设置为 0xcccccccc 而不是 0x00000000。

我将 1 传递给了 length。但是当我使用 new 分配它时,我在 m_p 中得到了大约 15 个符号字符。如果 m_size = lenth + 1 是 2,这怎么可能呢?我希望它只分配两个单元格。如何将其限制为长度 + 1?

 String::String(const char *str, int length) {
m_size = length + 1; // make room for null-terminated string

if (m_p != NULL)
m_p = NULL;

try
{
m_p = new char[m_size];
}
catch (bad_alloc e)
{
throw e;
}

strncpy(m_p, str, m_size);
}

最佳答案

让我指出这里的缺陷:

  • 您不会通过异常处理捕获分配问题,而是检查 NULL 的返回值。
  • 如果知道源和目标的大小,为什么要使用 strncpy? memcpy 是这里最快的选择。
  • 变量的初始值未定义,会因平台和配置而异。先不用管m_p是什么,赋值即可。
  • m_p 是个糟糕的名字。它没有说它是什么!至少 m_pString?
  • 捕获异常并重新抛出它?有什么用?
  • 您没有终止字符串。这是主要问题。您的源字符串是否终止?您似乎以未终止的字符串结束。
  • 正如所指出的,有现成的 STL 类可以为您做任何事情并且已经使用了几十年。

关于c++ - 'new' 的字符串分配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3533811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com