【问题标题】:Array "breaks" when resizing调整大小时数组“中断”
【发布时间】:2014-04-21 16:08:11
【问题描述】:

好吧,我有一个类,它应该是二次多项式的容器(这是一个模板,我在那里使用浮点数,但这并不重要)。我使用动态数组制作它,并且我应该重载 + 和 - 运算符......不是问题,是吗?好吧,在我真正运行它之前,它看起来一切都很好。

listf listf::operator+(listf rhs)
{
    listf newlist;
    for(int i = 0; i < elementcount; ++i)
        newlist.add(array[i]);
    for(int j = 0; j < rhs.elementcount; ++j)
        newlist.add(rhs.array[j]);
    std::cout<<newlist;
    return newlist;
}

没什么。应该正确地完成它的工作,对吧?该 cout 只是为了检查它是否有效。但事实并非如此。 应该做这样的事情,对吧? 一份清单包括:

X^2+5x+52.4
2X^2+7x-12

第二个只有 X^2+2X+1,它应该列出并显示:

X^2+5x+52.4
2X^2+7x-12
X^2+2X+1

不,是这样的:

-1.5584e+038X^2-1.5584e+038x-1.5584e+038
-1.5584e+038X^2-1.5584e+038x-1.5584e+038
-1.5584e+038X^2-1.5584e+038x-1.5584e+038

我已经和它斗争了很长一段时间,还没有找到它为什么会那样做。

添加新多项式的代码仍然很简单:

void listf::add(polynomial<float> plnm)
{
    if(array == NULL)
    {
        ++elementcount;
        array = new polynomial<float>[elementcount];
        array[0] = plnm;
    }
    else
    {
        array = resize(array, elementcount+1, elementcount);
        array[elementcount++] = plnm;
    }
}

而resize是这个类中的私有函数:

polynomial<float>* listf::resize(polynomial<float>* arr, int newSize, int oldSize)
{
    polynomial<float>* newArr = new polynomial<float>[newSize];
    for(int i = 0; i < oldSize; ++i)
    {
        newArr[i] = arr[i];
    }
    delete[] arr;
    return newArr;
}

如果我们要创建一个较小的数组(用于删除对象),我只是将 oldSize 设置为等于 newSize(我知道这是一种不好的做法,并且会让其他人感到困惑,但我只是在测试东西 :( )

我没有想法。向对象添加新元素似乎有效,但是当我想添加两个对象时,它会中断,打印不正确的元素,然后崩溃,CodeLite 在调用堆栈中报告类似“ntdll!LdrVerifyImageMatchesChecksumEx”的内容。更好的是,当我现在对其进行测试时,它显示了正确的值,但在返回时仍然崩溃。

【问题讨论】:

  • 只需使用std::vector&lt;ploynomial&lt;float&gt; &gt;,它就会为您解决这个问题。
  • 您能发布足够多的代码供我们构建和测试吗?请read this 获取良好示例代码的描述。
  • @user3556899 - 正如所指出的,您正试图用这个动态数组重新发明轮子。 std::vectorpush_back() 在向量的末尾添加一个项目,有 resize() 来更改向量的大小等。
  • 呃,不能使用 std::vector,这是一个问题。其次,虽然我可以提供整个代码,但包括类和模板在内的代码非常多,而且更大的问题是它不是英文的,不容易阅读。
  • 有什么理由不能使用std::vector

标签: c++ arrays


【解决方案1】:

忘记自制的动态数组,使用向量。每当您进入类和内存管理领域时,它并不像编写几个 new[] 和 delete[] 调用那么简单。它可以阻止您在程序开发中陷入困境。

#include <vector>
//...
typedef std::vector<polynomial<float> > PolynomialFloatArray;
//...
class listf
{
   PolynomialFloatArray array;
   //...
   void add(const polynomial<float>& plnm);
   //...
   PolynomialFloatArray& resize(PolynomialFloatArray& arr, int newSize)
};
//...
void listf::add(const polynomial<float>& plnm)
{
   array.push_back(plnm);
}

PolynomialFloatArray& listf::resize(PolynomialFloatArray& arr, int newSize)
{
   arr.resize(newSize);
   return arr;
}

简而言之,就是您编写的所有代码,减少到 2 或 3 行。

【讨论】:

  • 呃,问题是我不应该使用那个......如果可以,我不会问,只需使用矢量。
  • @user3556899 - Eh, the problem is I'm not supposed to use that 那么您的应用程序的目标是什么?是实现动态数组吗?如果是这样,为什么要用多项式求解使事情变得混乱?只需创建一个动态数组类,无论它将用于什么应用程序。然而,如果目标是创建一个解决多项式的应用程序,那么为什么它会受到不工作的动态数组类的阻碍呢?只需使用 std::vector。
【解决方案2】:

就像问题中的 cmets 指出的那样,您可能最好使用 std::vector,因为它有 push_back() 将内容添加到末尾,并自动调整大小以执行此操作,尽管您可以强制用resize()调整它的大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多