赋值运算符重载和无效内存

时间:2013-11-28 21:31:25

标签: c++ memory-management access-violation assignment-operator

我正在尝试重载这样的赋值运算符 -

polynom polynom::operator=(const polynom& p)
{
    this->grad = p.grad;
    this->arr = new double[grad+1];
    for(int i = 0; i <= p.grad; i++)
    {
        this->arr[i] = p.arr[i];
    }
    return *this;
}

这是.h文件:

    #pragma once
using namespace std;
#include <iostream>
class polynom
{
public:
    polynom(int grad, double* arr);
    polynom(int grad);
    polynom(polynom& p);
    polynom();
    ~polynom(void);
    polynom operator=(const polynom& p);
    friend ostream& operator<<(ostream& os, const polynom& p);
private:
    int grad;
    double* arr;
};

的.cpp:

#include "polynom.h"


polynom::polynom(int grad, double* arr)
{
    this->grad = grad;
    this->arr = new double[grad+1];
    for(int i = 0; i<=grad;i++)
    {
        this->arr[i] = arr[i];
    }
}

polynom::polynom(int grad)
{
    this->grad = grad;
    this->arr = new double[grad+1];
}

polynom::polynom()
{
    arr = NULL;
}

polynom::polynom(polynom& p)
{
}

polynom::~polynom()
{
    delete[] arr;
}

polynom polynom::operator=(const polynom& p)
{
    this->grad = p.grad;
    this->arr = new double[grad+1];
    for(int i = 0; i <= p.grad; i++)
    {
        this->arr[i] = p.arr[i];
    }
    return *this;
}

ostream& operator<<(ostream& os, const polynom& p)
{
    for(int i = 0; i <= p.grad; i++)
    {
        if(i == 0)
            os  << p.arr[i];
        else
        {
            if(p.arr[i]>=0)
                os << " + ";
            os << p.arr[i] << "x^"<<i;
        }
    }
    return os;
}

主:

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

void main()
{
    double arr1[] = {1,2,3};
    double arr2[] = {5,9};
    double arr3[] = {1,2,3,4};
    polynom p1(2, arr1);
    polynom p2(1, arr2);
    polynom p3(3, arr3);
    cout << p1 << "\n";
    p1 = p2 = p3;
    cout << p1 << "\n";
    std::system("pause");
}

我得到以下异常:

7.exe中的0x01331C16处的未处理异常:0xC0000005:访问冲突读取位置0x01337000。

在此行this->arr[i] = p.arr[i];

我对其原因一无所知。

1 个答案:

答案 0 :(得分:2)

您的代码有很多问题。其中一个原因是您没有定义复制构造函数,但是您正在通过赋值运算符的值返回一个对象(*this)。我猜想“复制”对象指向一些有趣的东西,并且访问此指针会导致未定义的行为。

那就是说,我很困惑任何人都可以应对赋值运算符的复杂性!您的赋值运算符有更多问题:

  1. 如果对象实际指向实际分配的内存,则会泄漏内存。
  2. 自我分配不会太好。
  3. 就个人而言,我在实现赋值运算符时遇到了麻烦,除非他们利用了复制构造函数,析构函数和swap()函数(当然,我只用了近25年的C ++编程)年,所以也许我会在某些时候弄明白)。 swap()可能尚不存在,但无论如何都应该实现:

    polynom& polynom::operator= (polynom other) {
        this->swap(other);
        return *this;
    }
    void polynom::swap(polynom& other) {
        std::swap(this->grad, other.grad);
        std::swap(this->arr, other.arr);
    }
    

    当然,这假设您有一个工作副本构造函数。

    以下是其他随机问题:

    1. 如上所述,复制构造函数需要正确实现。
    2. 在您的赋值运算符中,您不验证右侧polynom是否在NULL中具有非arr指针,但您的默认构造函数初始化arr成员到NULL
    3. using namespace std;之后包含标准标题,而不是之前。当然,标题应该有一个using - 指令!至少在标题中,您最好使用完全限定条件,例如std::ostream
    4. 这个不是一个问题,但有点挑剔:除非您使用<iostream>std::coutstd::cin,否则不应在标头中包含std::cerr std::clog!我会在标题中添加<iosfwd>,在实现中包含<ostream>,并且只在<iostream>中包含实际内容。
    5. (我曾声称只存储指向数组的指针存在另一个问题,但这不是代码;我从列表中删除了它;抱歉)。

相关问题