提问人:Dax Durax 提问时间:3/30/2013 最后编辑:Dax Durax 更新时间:3/30/2013 访问量:5251
C++ 析构函数,动态分配
C++ Destructors , dynamic allocation
问:
由于缺少析构函数,我最近遇到了一些错误(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 Destructor 需要从 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
在 中,成员 、 和 绝对不应该是 d。事实上,你永远不应该拿走一个成员的地址和它。当成员所属的对象被销毁时,成员将自动销毁。ObjTwo
myObjOne
num
x
delete
delete
例如,考虑有一个成员,其定义如下:
int* p;
这是指向 的指针。当指针所属的对象被销毁时,指针本身将被销毁。但是,想象一下,在构造函数中,您动态分配一个对象,如下所示:p
int
int
p = new int();
现在,由于动态分配对象,您将需要将 指向的对象。您应该在析构函数中使用 执行此操作。请注意,这不是破坏,而是破坏它指出的对象。由于是成员,因此不应手动销毁它。new
delete
p
delete p;
p
p
评论
bad_alloc
bad_alloc
ObjOne
可能需要析构函数。这与基元类型无关,而是与动态分配的内存(指针)之类的东西有关。您有一个成员,该成员可能是动态分配的,或者至少是指向动态内存的指针。所以你需要在这个上使用 或。
你所做的事情是致命的!您正在尝试从堆栈中删除内存 -> 未定义的行为,但大多数情况下都会崩溃。您的所有对象/变量都是堆栈分配的,因此您不能删除它们...int*
delete
delete[]
~ObjectTwo
评论
objOne
int*
new
评论
new
delete
jon