c++析构函数,动态分配

C++ Destructors , dynamic allocation

本文关键字:动态分配 析构函数 c++      更新时间:2023-10-16

由于缺少析构函数,我最近出现了一些错误(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不需要析构函数,因为它包含ObjOneObjTwo析构函数将需要从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];

您不需要使用任何delete。您应该 delete一些您以前分配给new的东西。

ObjTwo中,成员myObjOne, numx绝对不应该是delete d。事实上,你不应该取成员的地址并将其delete。当成员所属的对象被销毁时,成员将自动销毁。

例如,考虑这样定义一个成员:
int* p;

这个p是指向int的指针。当指针所属的对象被销毁时,指针本身也将被销毁。但是,假设在构造函数中动态分配一个int对象,如下所示:

p = new int();

现在,因为new动态分配对象,您需要delete p所指向的对象。您应该在delete p;的析构函数中这样做。注意,这并没有破坏p,而是破坏了它所指向的对象。由于p是成员,所以不应该手动销毁它。

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