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不需要析构函数,因为它包含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
的所作所为是致命的!您正在尝试从堆栈中删除内存->未定义行为,但大多数情况下会崩溃。所有的对象/变量都是堆栈分配的,所以你不能删除它们…
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- C++析构函数调用两次,堆栈分配的复合对象
- 如何在析构函数中删除C++中动态分配的数组?
- C++ 在析构函数调用之前删除的动态成员数组
- 取消分配动态分配的字符数组的析构函数
- 如何将析构函数分配给指针
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 使用私有析构函数删除动态分配的对象
- 导致堆缓冲区错误的动态分配数组的析构函数
- 使用自定义工具集获取动态退出析构函数链接错误 - eh 矢量析构函数
- 动态分配(堆上)的对象的析构函数是否会在返回函数中自动调用
- 具有受保护析构函数的类数组的动态分配
- 虚拟析构函数:如果基类动态分配内存,基类中是否需要它
- 在C++中,如果我引用一个具有解除分配析构函数~MyClass的对象,那么超出范围的引用会调用析构函数吗
- 动态内存分配、指针成员和析构函数
- c++析构函数,动态分配