将malloc更改为新运算符

时间:2016-04-28 10:15:20

标签: c++ malloc new-operator

我正在将路径规划代码从C更改为C ++。代码动态分配map中的状态。我没有清楚地理解newmalloc之间的区别。我收到了以下代码段的错误。

typedef struct cell
{ 
   int x,y;
   struct cell *n[5];
}cell_t;

typedef struct pq
{
   cell_t **heap;
   int len,cap;
}pq_t;

//for C version
func(pq_t *pq,50)
{
   pq->heap = malloc(sizeof(cell)*50);
   pq->len = 0;
   pq->cap = 0;
}
//for C++ version
func(pq_t *pq,50)
{
   pq->heap = (cell_t*)::operator new(sizeof(cell_t)*50);
   pq->len = 0;
   pq->cap = 0;
}

我得到的错误是:

  

无法在作业中将“cell_t * {aka cell*}”转换为“cell_t** {aka cell_s**}”

pq->heap =(cell_t*) ::operator new (sizeof(cell_t) * (50));""

我需要改变什么?

2 个答案:

答案 0 :(得分:8)

而不是:

pq->heap = (cell_t*)::operator new(sizeof(cell_t)*50);

你想要这个:

pq->heap = new cell_t[50];

也就是说,很明显你发布的代码并不是真正的代码,因此可能会有一些额外的错误。也许用编译的真实代码更新你的问题。

答案 1 :(得分:4)

new取类型或类型数组,然后计算大小,即

cell_t* p = new cell_t // allocate one cell

cell_t* p = new cell_t[50] // allocate 50 cells.

但是我觉得你在程序中使用标准容器之一会好得多,比如std :: vector

#include <vector>
..

std::vector<cell_t> myarray(50); // allocate 50 cell_t

然后你不需要担心释放内存,std :: vector会为你处理。