-1

由于缺少析构函数,我最近遇到了一些错误(bad_alloc)。

我目前有两个类,以这种方式设置:

class ObjOne {
friend class ObjTwo;
public:                  //constructors and some other random methods
    ObjOne(int n) {
    }

    ObjOne() {
    }

private:
    int currSize;
    int size;
    int *jon;
};


 class ObjTwo {
 public:                       //constructors and some other methods
     ObjTwo(ObjOne, int n) {}  //
     ObjTwo() {}
     ObjTwo(const ObjTwo &source) {    //copy constructor
        num = source.num;
        x = source.x;
        myObjOne=source.myObjOne;
     }
     ~ObjTwo() {                          //destructor
           delete #
           delete &x;
           delete &myObjOne;
      }


private:
    ObjOne myObjOne;
    int num, x;
};

这是我的运算符 = ObjTwo

ObjTwo& ObjTwo::operator=(const ObjTwo& other) {
    num = source.num;
    x = source.x;
    myObjOne=source.myObjOne;
    return *this;
}

首先,我的假设是(如果不正确,请更正这些):

ObjOne 不需要析构函数,因为它只是原始类型,编译器何时会使用默认析构函数来清理它。ObjTwo 确实需要一个析构函数,因为它包含 ObjOne ObjTwo 析构函数需要从 x、num 和 myObjOne 释放内存。

我已经在析构函数上做了一些尝试,但是我仍然遇到了 bad_alloc 错误(在使用巨大的循环等进行测试时)或其他错误(当前的错误在调用析构函数时会崩溃)。

感谢任何关于我做错的指导

编辑:当我简单地将它放在一个循环中时,我抛出了一个 bad_alloc 异常:

ObjTwo b(//some parameters);
ObjTwo a(//some parameters);
for (int i=0; i<20000000; i+) {
    bool x = (a == b);
}

这是重载的 == 运算符

bool ObjTwo::operator==(const ObjTwo& other) {

ObjTwo temp = other;

for(int i=myObjOne.x; i>=0; i--) {
    if(myObjOne.get(i)!=temp.myObjOne.get(i)) {
        return false;
    }
}
return true;
}

在阅读了一些错误之后,它似乎是由于内存不足引起的;我无法正常工作的析构函数会导致。这里可能是什么问题?

get 方法只返回 jon[i];

4

2 回答 2

2

您不需要任何使用delete. 你应该 delete使用你以前分配的东西new

ObjTwo中,成员myObjOnenumx绝对不应该是deleted。事实上,你永远不应该获取成员的地址和delete它。当成员所属的对象被销毁时,成员会自动销毁。

例如,考虑有一个这样定义的成员:

int* p;

p是一个指向int. 当它所属的对象被销毁时,指针本身也将被销毁。然而,想象一下在构造函数中你int像这样动态分配一个对象:

p = new int();

现在,由于new动态分配对象,您将需要 . 指向delete的对象p。您应该在析构函数中使用delete p;. 请注意,这不是破坏p,而是破坏它指出的对象。由于p是成员,因此您不应手动销毁它。

于 2013-03-29T20:48:33.527 回答
1

ObjOne可能需要一个析构函数。这不是关于原始类型,而是关于动态分配的内存(指针)之类的东西。您有一个int*成员,它可能是动态分配的,或者至少是指向动态内存的指针。所以你需要在这个上使用deletedelete[]
你在做什么~ObjectTwo是致命的!您正在尝试从堆栈中删除内存-> 未定义的行为,但大多数情况下会崩溃。你所有的对象/变量都是堆栈分配的,所以你不能删除它们......

于 2013-03-29T20:50:06.750 回答