【问题标题】:C++ malloc errorC++ malloc 错误
【发布时间】:2011-05-09 10:28:49
【问题描述】:

我是一名 Java 程序员,但现在我必须用 c++ 编写一点代码。几年前我学习了 C++ 的基础知识,所以我不太适合。

我写了一个描述多项式的小类。这里是:

#include "Polynom.h"
#include <iostream>

using namespace std;

Polynom::Polynom()
{
    this->degree = 0;
    this->coeff = new int[0];
}

Polynom::Polynom(int degree)
{
    this->degree = degree;
    this->coeff = new int[degree + 1];
}

Polynom::~Polynom()
{
    delete coeff;
}

void Polynom::setDegree(int degree)
{
    this->degree = degree;
}

void Polynom::setCoeffs(int* coeff)
{
    this->coeff = &*coeff;
}

void Polynom::print()
{
    int i;
    for(i = degree; i >= 0; i --)
    {
        cout<<this->coeff[i];
        if(i != 0)
            cout<<"x^"<<i;
        if(i > 0)
        {
            if(coeff[i - 1] < 0)
                cout<<" - ";
            else
                cout<<" + ";
        }
    }    
}

好的,现在我尝试读取多项式的次数和系数并将其打印到控制台中。这是代码:

#include <iostream>
#include "Polynom.h"
using namespace std;

int main()
{
    int degree;

    cout<<"degree = ";
    cin>>degree;
    int* coeff = new int[degree];
    int i;
    for(i = 0; i <= degree; i++)
    {
        cout<<"coeff[x^"<<i<<"] = ";
        cin>>coeff[i];
    }
    Polynom *poly = new Polynom(degree);
    //poly->setDegree(degree);
    poly->setCoeffs(coeff);
    cout<<"The input polynome is: ";
    poly->print();
    return 0;
}

编译代码时,一切正常。运行时,如果我给一个even度,然后给一些系数,程序运行正常。 但是:如果我定义一个度(例如3或5)然后给出系数,程序不会打印多项式并返回以下错误:

malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.

为什么会这样?我在哪里没有为数组分配足够的内存?我搜索了这个错误并偶然发现了this page,但那里提到的解决方案对我没有多大帮助。

也许您可以在我的代码中看到另一个问题?非常感谢您的帮助。

提前致谢。

【问题讨论】:

  • 可以发一下头文件吗?
  • 你应该在析构函数中做delete[] coeff;或者更好的是,使用std::vector&lt;int&gt;(这也会让您摆脱degree 成员)。
  • @Downvoter - 为什么?格式良好的问题,大量信息,海报做出了诚实的尝试。

标签: c++ malloc


【解决方案1】:

您的代码存在大量错误。 C++ 与 Java 完全不同,您似乎在使用指针时就像在 Java 中的引用一样,但它们显然不是。

Polynom::Polynom()
{
    this->degree = 0;
    this->coeff = new int[0];
}

这会创建一个大小为零的数组,这在 C++ 中是合法的,但几乎不是您想要的。

Polynom::~Polynom()
{
    delete coeff;
}

C++ 中的数组必须用 delete[] 删除:

Polynom::~Polynom()
{
    delete [] coeff;
}

这个:

void Polynom::setDegree(int degree)
{
    this->degree = degree;
}

没有意义——你改变了度数,而不是它关联的数组。

void Polynom::setCoeffs(int* coeff)
{
    this->coeff = &*coeff;
}

我不知道你认为这是在做什么,我怀疑你也不知道。而且你有内存泄漏。

这只是初学者 - 我怀疑还有更多不好的东西。你需要做两件事:

  • 阅读有关 C++ 的书籍。有编程经验,推荐Accelerated C++

  • 忘掉你的 Java 知识吧。正如我所说,这两种语言几乎没有任何共同点。

【讨论】:

  • this-&gt;coeff = &amp;*coeff;... 我怀疑 OP 试图做的是将内部指针 coeff 设置为新地址?在这种情况下,this-&gt;coeff = coeff; 会很好。
【解决方案2】:
int* coeff = new int[degree];
int i;
for(i = 0; i <= degree; i++)

您正在为degree 元素分配空间并将degree+1 元素放在那里...行为未定义。

【讨论】:

    【解决方案3】:

    在您的main() 函数中,int *coeff = new int[degree] 为您提供一个长度为degree 的数组,其元素索引范围从0degree-1,包括在内。在您的循环中,您正在访问元素 0degree,包括在内。这是未定义的行为,可能会也可能不会导致运行时错误等。

    【讨论】:

    • 感谢您的所有回复。确实是那个该死的索引。哦,好吧,我赢得了学生证。我是 C++ 新手,耶。我感觉就像几年前,当我开始编程时。 :-)
    【解决方案4】:

    for 循环中的语句 i &lt;= degree 导致了它。由于数组索引从0 开始,因此有效范围为0-&gt;degree-1。由于您正在写入无效的内存位置,因此您的程序的行为无法预测。

    【讨论】:

      猜你喜欢
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多