C ++分段创建对象数组时出错

时间:2013-03-28 19:33:12

标签: c++ memory inheritance constructor

假设我有一个类baseclass的对象:

// baseclass.h
class baseclass
{
    baseclass() # default constructor, constructs baseclass object
}

在.cpp for baseclass:

// baseclass.cpp
baseclass::baseclass()
{
    // member functions and variables
}

现在我的目标是拥有一个派生类,并在派生类的默认构造函数中,创建一个静态大小 n 基类对象的数组。为了尝试澄清,考虑这个的另一种方法是将基类视为扑克牌,我想通过调用派生类的默认构造函数来创建这些卡的数组(甲板)。我决定将问题的范围保持为抽象,所以我将继续使用base / derived,以便其他人可以更容易地看到它如何适用于它们。

我不确定以面向对象的方式设置它的最佳方法,到目前为止我有类似的东西,但我得到了segmentation fault。以下是我设置的方法:

// derivedclass.h (extending baseclass)
class derivedclass
{
    // default constructor for derivedclass object
    derivedclass();

    // a pointer to an object of type baseclass
    baseclass* bar;
    // or should it be:
    baseclass* bar[n] // where n is an integer
    // or is there a better way to do it?
}

最后,因为我说过derivedclass对象可以有一个数组,所以我必须对.cpp for derivedclass中的默认构造函数设置为true:

// derivedclass.cpp
derivedclass::derivedclass()
{
    // so I need to initialize the member array
    baseclass* bar = new baseclass[n] // where n is the size I want to initialize 
                                      // the array to
}

我列出的任何情况都会导致分段错误吗?创建此对象数组的最佳方法是什么?很抱歉,如果这是一个不起眼的问题,我仍然是一个学习内存分配和指针的学生,通常会处理我不必担心的语言。此外,我试图将问题抽象为其他人的利益。提前谢谢!

3 个答案:

答案 0 :(得分:3)

我不知道为什么你需要在这里使用动态分配。我宁愿做这样的事情,这也可以节省你在derivedclass的构造函数中的一些工作:

struct baseclass
{
    // Stuff...
};

struct derivedclass : baseclass
{
    // Stuff...

    baseclass objects[N];
};

在C ++ 11中,您应该使用std::array<>而不是普通的C风格数组(std::array<>是C风格数组的安全,零开销包装器):

// ...

#include <array>

struct derivedclass : baseclass
{
    // Stuff...

    std::array<baseclass, 10> objects;
};

答案 1 :(得分:1)

// so I need to initialize the member array
baseclass *bar = new baseclass[n];

除此之外,你没有初始化成员数组,只是一个与成员变量同名的局部变量,因此它会影响它(并且出于同样的原因,你也会泄漏内存丢失指向new已分配数组的指针。)

答案 2 :(得分:1)

为什么要使用new?为什么要从牌中获得牌组?甲板上有卡片。

 class Card
 {
     // ... whatever card does
 };

 class Deck
 {
 public:
     static int const CountOfCards = 36;
     typedef std::array<Card,CountOfCards> Cards;
     Cards cards;
     // etc. ... whatever deck does
 };