#include <iostream>
#include <string>
using namespace std;
class books {
private:
books *arr;
public:
books() {
arr = new books[10];
}
};
int main() {
books a;
cout << "helloo";
return 0;
}
有人请告诉我这段代码有什么问题吗?该程序刚刚运行并崩溃。
答案 0 :(得分:3)
有人请告诉我这段代码有什么问题吗?该程序刚刚运行并崩溃。
考虑如何逐行执行程序:
您创建了类book
的对象。由于它是默认初始化的,因此将调用默认构造函数。默认构造函数分配10个book
实例。由于这些实例是默认初始化的,因此会调用它们的默认构造函数。在执行第一个对象的构造函数期间,分配了10个book
实例的数组。由于这些实例是默认初始化的,因此会调用它们的默认构造函数。在执行第一个对象的构造函数期间,分配了10个book
实例的数组。由于这些实例是默认初始化的,因此会调用它们的默认构造函数。在执行第一个对象的构造函数期间,分配了10个book
实例的数组。由于这些实例是默认初始化的,因此会调用它们的默认构造函数。在执行第一个对象的构造函数期间,分配了10个book
实例的数组。 ...
你能看到问题吗?你有一个无限递归的函数,它不会停止,直到它占用了所有的堆栈空间,此时程序崩溃了。这种崩溃被称为&#34; Stack Overflow&#34;。
与崩溃无关的代码的另一个错误:您永远不会删除您分配的内存。使用裸指针动态分配内存是一个坏主意。
要创建包含多个子节点的树结构,我建议如下:
class books {
std::vector<books> arr;
// no constructor
};
这样,你不会泄漏内存,并且你得到没有子节点的叶子实例,所以没有无限递归。