由于缺少析构函数,我最近出现了一些错误(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
, num
和x
绝对不应该是delete
d。事实上,你不应该取成员的地址并将其delete
。当成员所属的对象被销毁时,成员将自动销毁。
int* p;
这个p
是指向int
的指针。当指针所属的对象被销毁时,指针本身也将被销毁。但是,假设在构造函数中动态分配一个int
对象,如下所示:
p = new int();
现在,因为new
动态分配对象,您需要delete
p
所指向的对象。您应该在delete p;
的析构函数中这样做。注意,这并没有破坏p
,而是破坏了它所指向的对象。由于p
是成员,所以不应该手动销毁它。
ObjOne
可能需要一个析构函数。这不是关于基本类型,而是关于动态分配内存(指针)之类的事情。您有一个int*
成员,它可能是动态分配的,或者至少是一个指向动态内存的指针。所以你需要使用delete
或delete[]
。
你在~ObjectTwo
的所作所为是致命的!您正在尝试从堆栈中删除内存->未定义行为,但大多数情况下会崩溃。所有的对象/变量都是堆栈分配的,所以你不能删除它们…