私有变量分配正确 背景:我不知道C++,我知道C. < /P>
问题:在名为lruTable.hh的文件中,我定义了私有变量分配正确 背景:我不知道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初始
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;。