我正在尝试用C ++实现图形。我使用包含两个变量的结构来表示图中的节点 -
a)一个整数,用于包含有关节点的一些信息。
b)包含与其连接的其他顶点的索引的列表。
以下是代码。
// Graphs using adjacency list
#include <iostream>
#include <list>
#include <cstdlib>
using namespace std;
// structure to represent a vertex(node) in a graph
typedef struct vertex{
int info;
list<int> adj; // adjacency list of edges contains the indexes to vertex
} *vPtr;
int main(){
vPtr node = (vPtr)malloc(sizeof(struct vertex));
node->info = 34; // some arbitrary value
(node->adj).push_back(2); // trying to insert a value in the list
return 0;
}
代码编译正常,但是当我推回列表中的元素时,我遇到了运行时错误。我的结构有什么问题吗?
我使用代码块和GNU GCC,C ++ 98编译器来编译我的代码。
答案 0 :(得分:10)
malloc
是一个C函数 - 它不应该与C ++对象一起使用,which is very well explained here (简答:在C ++中,当你不处理POD类型时,在您的情况下,std::list
,您必须调用对象的构造函数以使实际对象可供使用,malloc()
不会这样做。
You should used new
instead。虽然malloc
仅分配大小为vertex
的内存块,但new
会执行此操作,并且还会通过调用它的构造函数初始化std::list
(有趣的是,当您调用{时} {1}},你正在调用你的对象的析构函数。)
这是一段适合您案例的代码,虽然我建议您开始在C ++项目中使用更多C ++功能:
delete()
答案 1 :(得分:4)
一些事情。
malloc
,所以不会调用constructor
从来没有构建过非原始成员adj
NULL。您正在泄漏内存,因为您从未释放/删除任何动态分配的内存。
如果您使用的是C ++,为什么使用malloc
代替new
和delete
?
您不必在sizeof
for C ++中说结构顶点。
要修复它,你可以这样做:
vPtr node = new struct vertex(); // also change to delete instead of free
或
// use current malloc line, change adj to be a pointer to a list and new it
// but this will cause additional problems for you since you really need to use a constructor for STL::list
node->adj = new list<int>;
你不应该在这里使用malloc
。
答案 2 :(得分:2)
这是UpAndAdam的答案,完全写完。
// Graphs using adjacency list
//
#include <iostream>
#include <list>
#include <cstdlib>
using namespace std;
// structure to represent a vertex(node) in a graph
typedef struct vertex{
int info;
list<int> *adj; // adjacency list of edges contains the indexes to vertex
} *vPtr;
int main(){
vPtr node = (vPtr)malloc(sizeof(struct vertex));
node->adj = new list<int>;
node->info = 34; // some arbitrary value
(node->adj)->push_back(2); // trying to insert a value in the list
return 0;
}