在同一构造函数中初始化和分配动态内存

时间:2017-10-02 23:10:40

标签: c++ constructor initialization dynamic-arrays

假设我在.h文件中有一个类的私有数据成员

private:
    eventlist *pointer;
    int counter; 
    int size;   

和这个结构类型

struct eventlist// Define our struct type
{
char name[100];
char todo[100];
char where[100];
char when[100];
char attended[100];
char excitement[100];
};

我想创建一个动态的结构数组。以下是我作为构造函数的内容......

summerlist::summerlist()
{
size = 0;// Initialize size to zero
counter = 0;//Initialize counter to zero
pointer = new eventlist[size];

    strcpy(pointer[0].name,"\0");
    strcpy(pointer[0].todo,"\0");
    strcpy(pointer[0].where,"\0");
    strcpy(pointer[0].when,"\0");
    strcpy(pointer[0].attended,"\0");
    strcpy(pointer[0].excitement,"\0");


   }

我很好奇:

  1. 在构造函数中分配我的结构数组是否可以?它会引起任何问题吗?
  2. 在将指针初始化为NULL之前分配数组是否可以?我假设这不是什么大问题因为我在初始化它作为动态数组的指针。但我想知道这是否是一种可接受的做法。
  3. 像我一样初始化数组的第一个元素是否有意义?我认为既然内存被分配给数组的至少一个元素(基础),那么初始化第一个元素是一个很好的做法,但是我是否可视化相关性仍然有点不稳定。
  4. 最后,在我创建动态数组并将指针设置为= NULL之后,这只会造成内存泄漏,并且不会初始化第一个元素吗?

1 个答案:

答案 0 :(得分:2)

  1. 是的,这很好,实际上在构造函数中进行分配,并且在析构函数中删除是您应该实现的RAII类型的开始。
  2. 你只是指定一个指向某个内存的指针,指针前面的指针无关紧要,它可以是任何东西。
  3. 这完全取决于你的申请。
  4. 是的,你愿意。您需要delete您创建的任何内存。我会建议你的课程的析构函数。请务必将new[]delete[]匹配。
  5. 最后请注意,这种类型的代码有利于学习,但对c++中的实现有害。除非你有某种形式的内存限制(你显然没有创建一大堆动态存储结构),所以你应该切换到使用一些内置的c ++类型,比如std::vector来替换你的动态数组,std::string替换char数组。

    struct eventlist {
        std::string name;
        ...
    }
    
    class summerlist {
    
    public:
        summerlist();
    
    private:
        std::vector<eventlist> pointer;
        int counter; 
    }
    
    summerlist::summerlist()
    {
        counter = 0;// Initialize the counter to zero
    }
    

    这更容易使用和控制。而且你避免了这样做的错误:pointer = new eventlist[size]; size为0.这可以让你头疼。