【问题标题】:basic question c++, dynamic memory allocation基本问题c++,动态内存分配
【发布时间】:2010-01-21 11:08:15
【问题描述】:

假设我有一堂课

class person
{
char* name;
public:
void setname(const char*);
};
void person::setname(const char* p)
{
name=new char[strlen(p)];
strcpy(name,p);
name[strlen(p)]='\0';
}

我的问题是关于这条线的 名称=新字符 [strlen(p)]; 假设 p 指针指向字符串,即“zia”,现在 strlen(p) 将返回 3,这意味着我们有一个由 4 个字符组成的数组,即 char[3] 现在我将字符串复制到名称中,并在第 4 个位置,我放空字符,这有什么问题??????

【问题讨论】:

    标签: c++ oop


    【解决方案1】:

    你说:

    我们有一个由 4 个字符组成的数组,即 字符[3]

    令人惊讶的是,char[3] 是一个由三个字符组成的数组,而不是四个字符!

    【讨论】:

    • 我很抱歉,我不知道我到底在想什么!抱歉,我一直在禁食,漫长的一天即将结束。 :S
    【解决方案2】:

    您必须为零终止符再分配一个字符:

    name = new char[strlen(p) + 1];
    

    【讨论】:

      【解决方案3】:

      问题是

      1. 你永远不会delete[] name;,因此每次用户调用setname(),你都会泄漏一个数组。
      2. 要容纳额外的'\0',您需要为strlen(p)+1 元素分配。

      【讨论】:

        【解决方案4】:

        您需要为 \0 字符再分配一个内存位置,否则当您这样做name[strlen(p)]='\0'; 时,您会遇到分段错误。基本上做new char[strlen(p) + 1]

        【讨论】:

          【解决方案5】:

          你应该分配 strlen(p)+1 个字符:

          name = new char[strlen(p)+1];
          

          【讨论】:

            【解决方案6】:

            你出错的地方就在这里:

            现在 strlen(p) 将返回 3 这意味着我们有一个由 4 个字符组成的数组,即 char[3]

            4 个字符的数组是char[4];如果您动态分配,则必须将 4 传递给 operator new,或者,一般来说:

            name=new char[strlen(p)+1];
            

            【讨论】:

              【解决方案7】:
              void person::setname(const char* p)
              {
              
              name=new char[strlen(p) + 1]; // make a room to have null character 
              strcpy(name,p);
              name[strlen(p)]='\0';
              
              }
              

              数组索引从 0 开始,因此大小为 5 的数组的最大索引为 arr[4]。

              【讨论】:

              • strcpy 将 0 终止符放入 - 无需再做一次
              【解决方案8】:

              很多人都提到了解决您遇到的直接问题的方法。在这样做的过程中,他们几乎对你造成了伤害。除非您有真的很好的理由不这样做,否则您应该做的是将名称定义为和std::string,并使用其赋值运算符正确处理工作。

              如果您确实有充分的理由避免使用std::string,那么您应该设计一个自己的字符串类,并改用它。至少在我看来,以你的方式编写代码,动态分配和到处都是strcpys 只是一个糟糕的主意。即使在最好的情况下,它也很难阅读,容易出现很多愚蠢的错误,而且基本上不可能使任何地方接近异常安全。

              【讨论】:

                猜你喜欢
                • 2011-09-13
                • 2012-05-02
                • 1970-01-01
                • 2011-01-19
                • 2022-01-22
                • 2021-03-13
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多