尝试将值赋给* this指针失败

时间:2016-04-18 07:28:35

标签: c++ class object this

我用C ++编写了这个程序,如果我在评论中添加最后两行,它的工作原理非常好: a = b; MyAr c(b); 我用我删除它的方法测试了它。我认为问题在于*this指针,当我编译并运行程序闪烁片刻然后消失时。你能帮我么?谢谢!

#include <iostream>
using namespace std;

class MyAr {
    int *p;
    int len;
    public:
        MyAr();
        MyAr(int a);
        MyAr(const MyAr& ob);
        ~MyAr();

        MyAr& operator=(const MyAr& ox) { *this = ox; }
        int& operator[](int i) { return p[i]; }
        int length();
};

MyAr::MyAr() : p(0), len(0) {}
MyAr::MyAr(int a) : p(new int[a]), len(a) {}
MyAr::MyAr(const MyAr& ob) { *this = ob; }
MyAr::~MyAr() { delete p; }

int MyAr:: length(){
    return len;
}

int main(){

    MyAr a;
    MyAr b(10);
    for(int i=0; i< b.length(); ++i)
        b[i] = i;

    a = b;
    MyAr c(b);

    system("pause");
    return(0);
}

2 个答案:

答案 0 :(得分:4)

定义

MyAr& MyAr::operator=(const MyAr& ox) { *this = ox; }

是递归的,因为赋值*this = ox再次调用重载的赋值运算符。所以你有无限的递归(导致最终终止你的程序)。

与调用以下函数相同:

void f() { f(); }

或者,在英语中,您已经将“从值ox分配”的含义定义为“从值ox分配”,而您真正需要做的是定义它是什么应该就你的类型的组成结构而言!

例如:

MyAr& MyAr::operator=(const MyAr& ox) {
   delete [] a;
   a = nullptr;
   len = 0;

   return *this;
}

(这可能没有你想要的语义;修改品尝。)

答案 1 :(得分:0)

你将在c ++中做的最重要的事情之一就是学会编写正确的构造函数和析构函数:

#include <cassert>
#include <cstring>
#include <utility>

class MyAr {
    int *p;
    int len;

public:

    MyAr() : p(nullptr), len(0) {};
    MyAr(int a) : p(new int[a]), len(a) {};

    // because we are overloading the destructor, rule of 3 is required (c++03)

    MyAr(const MyAr& ob)
    : p( nullptr), len(ob.len)
    {
        if (len) {
            assert(ob.p);
            p = new int[len];
            std::memcpy(p, ob.p, len);
        }
    }

    MyAr& operator=(const MyAr& r)
    {
        MyAr tmp(r);
        swap(tmp);
        return *this;
    }

    ~MyAr() {
        // note: delete []
        delete [] p;
    }

    // or rule of 5 (c++11)

#if __cplusplus >= 201103L

    MyAr(MyAr&& r)
    : p(r.p)
    , len(r.len)
    {
        r.p = nullptr;
        r.len = 0;
    }

    MyAr& operator=(MyAr&& r)
    {
        auto tmp = MyAr(std::move(r));
        swap(tmp);
        return *this;
    }

#endif

    void swap(MyAr& other)
    {
        using std::swap;
        swap(p, other.p);
        swap(len, other.len);

    }

    int& operator[](int i) { return p[i]; }
    int length();
};