创建对象数组c ++时崩溃

时间:2017-10-25 08:41:35

标签: c++ arrays class oop object

#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;
}

有人请告诉我这段代码有什么问题吗?该程序刚刚运行并崩溃。

1 个答案:

答案 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
};

这样,你不会泄漏内存,并且你得到没有子节点的叶子实例,所以没有无限递归。