使用new时,双指针不会调用对象构造函数

时间:2018-08-01 16:32:58

标签: c++

我的问题似乎只能用单个指针来回答。我正在尝试动态分配2d链表。尝试使用类llist构造函数将头和尾指针设置为NULL时遇到的问题:

//I've included only the parts that I see are neccesary
 struct node {
    int value ;
    int weight ;
    node* next ;
 } ;
 class  llist{
      private :
          node* tail, *head ;
      public :
           llist(){tail = NULL ;  head = NULL ;} /* this unneccesary retype is to make sure 
                                                    that it wasn't a typo*/
}
class list_graph
{
    private :
        int size, s;
        llist ** v ;
    public :
        list_graph(int s){
             this -> s = s ;
             size = 0 ;
        v = new llist* [s] ; 
        }
}

我已经使用调试器并执行了所有步骤,并且在创建llist类型的对象之后,似乎没有调用list_graph的构造函数,因此依赖于此的所有其他函数失败并给我分段错误。我在做错什么吗?还是在使用STL列表之外是否有其他解决方法,非常感谢

3 个答案:

答案 0 :(得分:2)

此:

  v = new llist* [s] ; 

创建一个指向类型llist的指针数组,但不创建任何llist对象。如果您想要一系列这样的东西,那么您想要:

  llist * v ;  

和:

  v = new llist[s] ; 

或者更好,如果这不是家庭作业,请使用std :: vector。而且不要将llist ** v之类的东西视为“双指针”;认为它们是什么-指向指针的指针。

答案 1 :(得分:1)

如果您要分配2D指针数组,则可以通过以下几种方式进行:

在指定了widthheight的情况下使用指针数组的动态数组:

llist** data = new llist*[width];
for (int i = 0; i < width; ++i){
    data[i] = new llist[height]; // constructors get called here
}

// accessing a linked list, make sure x is in [0, width) and y is in [0, height):
data[x][y]->value;

使用单个指针数组:

llist* data = new llist[width * height]; // constructors get called here

// accessing a linked list:
// again, make sure x is in [0, width) and y is in [0, height)
data[x + (y * width)]->value;

答案 2 :(得分:0)

如果要将mov ax, [num1]保留为指向v对象的指针的数组,而不是llist对象(由Neil Butterworth建议)的数组,则通过将您的llist构造函数更改为

list_graph

编辑:为避免在for循环中调用 list_graph(int s) : size(0), s(s), v(new llist* [s]) { for (int i(0); i < s; ++i) v[i] = new llist(); } new次,您可以一次预分配所有s s个对象。但是,这意味着它们不能单独删除。您的课程看起来像

llist