首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态字符串数组

动态字符串数组
EN

Stack Overflow用户
提问于 2013-03-14 19:48:26
回答 2查看 122关注 0票数 0

我对下面的课程有问题。我认为问题出在字符串数组上,因为我做了另外两个类,问题是一样的。当我运行程序时,它抛出“双重释放或损坏”,但我不认为任何双重损坏是可能的。问题与输入字符串作为引用或作为Add方法中的公共参数是相同的。

代码语言:javascript
复制
class WareH
{
        public:
        WareH(void)
        {
               first = true;
               rows = 1;
               inLine = 0;
               cnt = 0;
               max = 2;
               cL = 0;
               strs = new string[max];
        }
        ~WareH(void)
        {
               delete [] strs;
        }
        bool    Add(string& str, int ending)
        {
               if (first)
                     inLine++;
               else
                     cL++; 
               if (ending == 0)
               {
                     if (first)
                          first = false;
                     if (cL != inLine)
                          return false;
                     rows++;
               } 
               strs[cnt++] = str;
               Bigger();
               return true;
         }
         void Bigger(void)
         {
                if(max == cnt)
                {
                       max *= 2;
                       string* tmp = new string[max];
                       for (int i = 0; i < cnt; i++)
                              tmp[i] = strs[i];
                       delete [] strs;
                       strs = tmp;
                }
         }
         friend ofstream& operator<<(ofstream& of,WareH war)
         {
                for (int a = 0; a < war.cnt; a++)
                       of << war.strs[a] << endl;
                return of;
         }
private:
      bool first;
      int rows, inLine, cnt, max, cL;
      string* strs;
};
EN

回答 2

Stack Overflow用户

发布于 2013-03-14 20:03:39

当一个类管理资源并在其析构函数中释放它们时,您必须考虑Rule of Three,以确保复制一个对象不会导致两个对象管理相同的资源。

这就是这里发生的事情:默认的复制构造函数和复制赋值操作符将复制指针,给出两个对象,这两个对象都将在销毁时尝试删除相同的数组。解决方案包括:

  • 删除复制构造函数和复制赋值运算符以防止复制;或者
  • 实现它们以将字符串复制到新数组中,而不仅仅是指针;或者
  • 使用std::vector而不是自己管理内存分配。
票数 1
EN

Stack Overflow用户

发布于 2013-03-14 20:06:24

当我运行程序时,它抛出“双重释放或损坏”,但我不认为任何双重损坏是可能的。

有根据的猜测如下:

问题不在于您所展示的代码,而在于客户端代码。以下是我认为会发生的事情:

您编写了客户端代码来实例化(或按值赋值或返回或存储在std容器中) WareH实例,并且由于您没有定义复制构造函数和赋值操作符(请参阅"The Big Three"),它们最终将从源对象复制值。当这些实例中的第一个实例(彼此分配)被删除时,它们会删除strs指针。

当删除第二个实例时,它们会删除之前删除的相同strs指针(因为默认的复制构造函数和赋值操作符不会复制已分配的内存,而只是复制指针)。

解决方案(如果这确实是问题所在):

  • 工作(和坏)解决方案:为您的类显式定义复制构造和赋值运算符。
  • 工作(和好)解决方案:将strs实现为std::vector<std::string>,而不是std::string*std::string*
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15408401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档