如何在类构造函数中初始化动态分配的数组

时间:2016-09-11 07:01:18

标签: c++ segmentation-fault initialization dynamic-memory-allocation

我们应该为每个索引分配一个空字符串,然后替换 使用函数addB()中的值。 我对此很陌生,所以我遇到了很多麻烦。

class A //in a.h

{

  private:

    B * b;

    int maxNumberOfItems;

    //...

  public:

  A();

  ~A();

 void addB(const B & something);

};

//in a.cpp

 A::A()

  {

    maxNumberOfItems=10;
    for(int i=0;i<maxNumberOfItems;i++)
    {
       b[i]="";//has to be an empty string, I am getting a segmentation fault
    }

  }

  A::~A(){/*...*/}

  //...

//in b.h

class B
{

 private:

      string name;

      int price;

  public:

      void setName(string);

      string getName();

      void setPrice();

      int getPrice(int);

      B & operator=(string &);

};

//in b.cpp

B & B::operator=(string & a){name = a;price = 0; return *this;}
//...

这只是显示我的问题的程序片段

3 个答案:

答案 0 :(得分:3)

你应该在使用动态数组之前分配内存。我已经为b

分配了内存
class A //in a.h

{

private:

    B * b;

    int maxNumberOfItems;

    //...

public:

A();

~A();

void addB(const B & something);

};

//in a.cpp

A::A()

{
    maxNumberOfItems=10;
    b = new B[maxNumberOfItems];

    for(int i=0;i<maxNumberOfItems;i++)
    {
    b[i]="";//has to be an empty string, I am getting a segmentation fault
    }

}

A::~A(){/*...*/}

//...

//in b.h

class B
{

private:

    string name;

    int price;

public:

    void setName(string);

    string getName();

    void setPrice();

    int getPrice(int);

    B & operator=(string &);

};

//in b.cpp

B & B::operator=(string & a){name = a;price = 0; return *this;}

答案 1 :(得分:3)

看起来class A应该是一个动态数组类。

创建A的新实例时,还必须为数组b分配内存。这只是指向内存中某个点的指针。从你发布的代码中,它没有被初始化并且可以指向任何随机存储器位置 - 这是不好的(即你的段错误的可能原因)。

我建议做出以下更改。

A::A(){
  maxNumberOfItems=10;
  b = new B[maxNumberOfItems]; // b is an array of B objects.
                               // with default constructed values
  // This way avoids the need for using a for loop and reassigning values
}

~A(){
  if (b != NULL) { delete b; }
}

class B{
  private:
    //....
  public:
     B(): name(""), price(0) {}
    // Although the default constructor without defining one should behave the same.
    // This just makes it explicit. what name and price default to.
}

答案 2 :(得分:2)

maxNumberOfItems=10;
//add this line to your code
b = new B[maxNumberOfItems];
//do some error check stuff
for(int i=0;i<maxNumberOfItems;i++)
{
   b[i]="";//has to be an empty string, I am getting a segmentation fault
}

你没有为b [i]分配内存,所以你得到一个段错误。