【问题标题】:Crash on creating an Object Array c++创建对象数组c ++时崩溃
【发布时间】:2017-10-25 08:41:35
【问题描述】:
#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;
}

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

【问题讨论】:

  • 包含书籍的书籍包含书籍的书籍...
  • 你递归分配内存,导致栈溢出。
  • 调试器在您调试时告诉您什么?
  • 我想创建一个数组并在其中存储将在类中定义的不同变量。我怎么做?在私有 int arr[10] 中;在构造函数 arr[0].cost=10; ??
  • 一个好的C++ book 是为了。

标签: c++ arrays class oop object


【解决方案1】:

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

考虑程序是如何逐行执行的:

您创建了一个 book 类的对象。由于它是默认初始化的,因此将调用默认构造函数。默认构造函数分配 10 个 book 实例。由于这些实例是默认初始化的,因此会调用它们的默认构造函数。在执行第一个对象的构造函数期间,分配了一个包含 10 个book 实例的数组。由于这些实例是默认初始化的,因此会调用它们的默认构造函数。在执行第一个对象的构造函数期间,分配了一个包含 10 个book 实例的数组。由于这些实例是默认初始化的,因此会调用它们的默认构造函数。在执行第一个对象的构造函数期间,分配了一个包含 10 个book 实例的数组。由于这些实例是默认初始化的,因此会调用它们的默认构造函数。在执行第一个对象的构造函数期间,分配了一个包含 10 个book 实例的数组。 ...

你能看出问题吗?您有一个无限递归函数,该函数在占用所有堆栈空间之前不会停止,此时程序崩溃。这种崩溃称为“堆栈溢出”。


与崩溃无关的代码的另一个错误:您永远不会删除分配的内存。使用裸指针来动态分配内存是个坏主意。

要创建具有多个子级的树结构,我建议如下:

class books {
    std::vector<books> arr;
    // no constructor
};

这样,您就不会泄漏内存,并且您将拥有没有子节点的叶子实例,因此没有无限递归。

【讨论】:

  • "直到它占用了所有堆栈空间" 因为只有一个 books 被分配了自动存储持续时间(最常见的是在堆栈上),其余的是使用动态存储持续时间创建(使用 new 运算符) - 它很可能会一直运行,直到耗尽所有可用内存,并由于抛出 bad_alloc 而崩溃。
  • @AlgirdasPreidžius 构造函数调用(并且可能是分配器调用)每个都有自己的堆栈帧,它使用堆栈内存。当然,如果计算机的内存非常少并且提供了相对较大的堆栈,或者如果操作系统过度使用,那么 OOM 杀手也会因为顽皮而将其杀死。但我发现堆栈溢出最有可能发生。
猜你喜欢
  • 2015-06-09
  • 2013-11-12
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2017-03-09
  • 2012-10-31
相关资源
最近更新 更多