Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
私有变量分配正确 背景:我不知道C++,我知道C. < /P>_C++ - Fatal编程技术网

私有变量分配正确 背景:我不知道C++,我知道C. < /P>

私有变量分配正确 背景:我不知道C++,我知道C. < /P>,c++,C++,问题:在名为lruTable.hh的文件中,我定义了 struct lnode { struct lnode *next; struct lnode *prev; }; struct Table { struct lnode *list; int size; }; class lruTable { private: struct Table *table; public: lruTable(); }; 我希望类构造函数lruTable初始

问题:在名为lruTable.hh的文件中,我定义了

struct lnode {
    struct lnode *next;
    struct lnode *prev;
};

struct Table {
    struct lnode *list;
    int size;
};

class lruTable {

private:
    struct Table *table;
public:
    lruTable();

};
我希望类构造函数lruTable初始化私有变量表,以便table->list是双链接列表的头部,并且应该初始化为在两个方向上指向自身。在一个名为lruTable.cc的文件中,构造函数是

lruTable::lruTable() {
    table = TableAlloc();
}
表分配器为

struct Table *TableAlloc(void) {
    struct Table *t = (struct Table *) malloc(sizeof(struct Table));
    if (t == NULL) {
        fprintf(stderr, "[ERROR] %s:%d: malloc failed\n", __FILE__, __LINE__);
        exit(EXIT_FAILURE);
    }

    t->size = 0;
    t->list = lnconst(); // A
    return t;
}
struct lnode *lnconst(void) {

        struct lnode *ln = (struct lnode *) malloc(sizeof(struct lnode *));
        if (ln == NULL) {
            fprintf(stderr, "[ERROR] %s:%d: malloc failed\n", __FILE__, __LINE__);
            exit(EXIT_FAILURE);
        }

        ln->next = ln;
        ln->prev = ln;
        return ln;
}
最后,lnode分配器作为

struct Table *TableAlloc(void) {
    struct Table *t = (struct Table *) malloc(sizeof(struct Table));
    if (t == NULL) {
        fprintf(stderr, "[ERROR] %s:%d: malloc failed\n", __FILE__, __LINE__);
        exit(EXIT_FAILURE);
    }

    t->size = 0;
    t->list = lnconst(); // A
    return t;
}
struct lnode *lnconst(void) {

        struct lnode *ln = (struct lnode *) malloc(sizeof(struct lnode *));
        if (ln == NULL) {
            fprintf(stderr, "[ERROR] %s:%d: malloc failed\n", __FILE__, __LINE__);
            exit(EXIT_FAILURE);
        }

        ln->next = ln;
        ln->prev = ln;
        return ln;
}
我已经验证了LNCOST是否按照我的要求初始化列表头。事实上,在A行运行GDB时,表t与我所希望的完全相同,即t->list->next==t->list和t->list->prev==t->list。然而,一旦TableAlloc在构造函数中返回,就会出现一些问题,而我得到的是table->list->next==table->list desired和table->list->prev==table不正确。我已经通过在GDB中打印地址验证了这一点。

您的LNCST中的malloc内存不足: mallocsizeofstruct lnode*;将提供指针的大小,而不是完整结构节点的大小

这样,您存储prev的内存就不是您的了,它会根据编译器/操作系统的内存布局随时更改

显然,您需要使用mallocsizeofstruct lnode

常量中的malloc内存不足: mallocsizeofstruct lnode*;将提供指针的大小,而不是完整结构节点的大小

这样,您存储prev的内存就不是您的了,它会根据编译器/操作系统的内存布局随时更改


显然,您需要使用mallocsizeofstruct lnode

下一行没有分配正确的内存量

struct lnode *ln = (struct lnode *) malloc(sizeof(struct lnode *));
你需要使用

struct lnode *ln = (struct lnode *) malloc(sizeof(struct lnode));
关于代码的几点

在C++中,在声明完之后,不需要使用Stutt表和StultLNog。您可以简单地使用Table和lnode

不要使用malloc/free。使用“新建”和“删除”

以下是您的代码:

struct lnode {
   lnode *next;
   lnode *prev;
};

struct Table {
   lnode *list;
   int size;
};

class lruTable {

   private:
      Table *table;
   public:
      lruTable();

};

lruTable::lruTable() {
    table = TableAlloc();
}

Table *TableAlloc(void) {
    Table* t = new Table;
    t->size = 0;
    t->list = lnconst();
    return t;
}

lnode *lnconst(void) {
   lnode* ln = new lnode;;
   ln->next = ln;
   ln->prev = ln;
   return ln;
}

下一行未分配正确的内存量

struct lnode *ln = (struct lnode *) malloc(sizeof(struct lnode *));
你需要使用

struct lnode *ln = (struct lnode *) malloc(sizeof(struct lnode));
关于代码的几点

在C++中,在声明完之后,不需要使用Stutt表和StultLNog。您可以简单地使用Table和lnode

不要使用malloc/free。使用“新建”和“删除”

以下是您的代码:

struct lnode {
   lnode *next;
   lnode *prev;
};

struct Table {
   lnode *list;
   int size;
};

class lruTable {

   private:
      Table *table;
   public:
      lruTable();

};

lruTable::lruTable() {
    table = TableAlloc();
}

Table *TableAlloc(void) {
    Table* t = new Table;
    t->size = 0;
    t->list = lnconst();
    return t;
}

lnode *lnconst(void) {
   lnode* ln = new lnode;;
   ln->next = ln;
   ln->prev = ln;
   return ln;
}

你是否强制在C++中使用MALOC?我不是。我在任何地方都能恢复到C,因为我不知道C++。你应该使用新的和删除,而不是Maloc和FrECAN。我希望如果我继续学习使用Maloc,会有什么东西坏掉。如果你想学习/使用C++,当你遇到一些你不懂的东西时,回到C不是一个好主意。C中很多好的实践是C++中的差的实践,反之亦然,代码中的两种方式都是如此,所以你所要达到的所有目标都是一个蹩脚的程序员,他们编写的C和C++混合语言在这两种语言中都是很差的。这需要更多的时间,但是如何在C++中有效地处理事情将意味着你在C++中更有效。如果你想有效地使用两种语言,它也有助于保持差异,你是否被迫在C++中使用MALOC?我不是。我在任何地方都能恢复到C,因为我不知道C++。你应该使用新的和删除,而不是Maloc和FrECAN。我希望如果我继续学习使用Maloc,会有什么东西坏掉。如果你想学习/使用C++,当你遇到一些你不懂的东西时,回到C不是一个好主意。C中很多好的实践是C++中的差的实践,反之亦然,代码中的两种方式都是如此,所以你所要达到的所有目标都是一个蹩脚的程序员,他们编写的C和C++混合语言在这两种语言中都是很差的。这需要更多的时间,但是如何在C++中有效地处理事情将意味着你在C++中更有效。如果你想在两种语言中有效地工作,也可以帮助你了解差异,如果不需要,就不要在C++中使用Maloc。new将根据正在构造的类型的大小自动缩放分配,并为这些类型运行适当的构造函数。如果我继续使用malloc,是否会出现问题?不,如果您正确使用它。它更危险,就像驾驶没有安全带一样。除了危险之外,如果你的结构或类有一个,则不需要用MALOC调用构造函数和析构函数。要添加-除非你绝对必须使用C++中的Maloc。new将根据正在构造的类型的大小自动缩放分配,并为这些类型运行适当的构造函数。如果我继续使用malloc,是否会出现问题?不,如果您正确使用它。它只是更危险,有点像没有安全带的驾驶。除了更危险之外,如果你的结构或类有malloc,构造函数和析构函数不会被malloc调用。如果你做了正确的
卡车司机在桌子上,你们不需要桌子,你们可以直接做新桌子。或者更好,用智能指针替换Table*Table。编辑:您可能根本不需要指针,只需执行Table;。若你们在表中创建了一个合适的构造函数,你们不需要TableAlloc,你们可以直接创建一个新的表。或者更好,用智能指针替换Table*Table。编辑:您可能根本不需要指针,只需执行Table;。