-1

由于缺少析构函数,我最近有一些错误(bad_alloc)。C++析构函数,动态分配

我现在有两个班,这样设置:

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];

+0

你没有'new'任何东西,没有必要'delete'。 –

+1

你的例子都不正确。你似乎有一些误解。如果你的类分配了一些内存,你需要一个析构函数。 ObjTwo不会这样做,也不需要析构函数。 ObjOne也没有提供给我们的代码。但是ObjOne中的大红旗是指针。如果ObjOne分配一些内存并使用'jon'指向这个内存,那么它确实需要一个析构函数。你应该寻找什么,如果你的类包含指针,那么他们可能需要一个析构函数。 – john

+0

编辑完成后 - 错误可能是因为您的内存不足。但是你还没有向我们展示任何分配内存的代码。到目前为止,你向我们展示的只是糟糕的析构函数。发布完整的代码。 – john

回答

2

您不需要delete的任何用途。你应该只有delete东西,你以前分配new

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

考虑,例如,具有将其这样定义的成员:

int* p; 

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

p = new int(); 

,因为new动态分配的对象,您将需要delete对象通过p指向。你应该在delete p;的析构函数中做到这一点。请注意,这不会破坏p,它正在销毁它指出的对象。由于p是会员,因此您不应该手动将其销毁。

+0

这就是我的想法;然而,为什么我会在遇到bad_alloc错误时执行反复的操作,而且没有'new'或'malloc'。 –

+0

@DaxDurax它可能来自多个地方。您最好尝试找到'bad_alloc'异常的来源。 –

+0

@DaxDurax例如,将元素插入标准容器可能会导致'bad_alloc'。 –

1

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

+0

否...''objOne'' *可能*需要一个析构函数,如果'int *'成员是使用'new'分配的,但这不是设置该成员的唯一方法 - 他可以用另一个地址初始化它整数从其他地方。在他的情况下,它根本没有被分配,所以他不需要析构函数。 –

+0

我纠正了我的帖子,但通常你会有一个指向动态分配内存的指针......从这几行代码中不清楚。 –