将malloc更改为新原因错误

时间:2013-02-22 06:37:55

标签: c++

http://sequitur.info/sequitur_simple.cc

处有一段代码

我更改了mallocfree

R = (rules **) malloc(sizeof(rules *) * num_rules);
free(R);

newdelete

R = (rules **) new(sizeof(rules *) * num_rules);  //ERROR
delete(R);

g++显示此错误:

error: expected type-specifier before â;â token
error: invalid conversion from âlong unsigned intâ to âvoid*â [-fpermissive]
/usr/include/c++/4.6/new:103:14: error:   initializing argument 2 of âvoid* operator new(std::size_t, void*)â [-fpermissive]

3 个答案:

答案 0 :(得分:4)

假设你的变量类型是正确的,它应该是

R = new rules*[num_rules];

稍后,当您要释放它时,请使用

delete[] R;

但很可能,OP正在尝试解决这里的“错误”问题(在设计这段代码时所做的假设可能不正确......)。 有关更多详细信息,请参阅Jerry Coffin的回答here

关于何时使用new功能(展示位置新功能),请参阅refp的回答here

答案 1 :(得分:3)

mallocnew都分配存储,但它们大不相同,不仅在逻辑上,而且在语法上也是如此。一个是普通函数,另一个是运算符。


要为num_rules rules*分配存储空间,您需要使用以下内容。

rules ** R;

...

R = new rules* [num_rules];

...

delete [] R;

但我看到new被称为函数?

不是真的,你可能已经看到了类似函数调用的东西,但事实并非如此。

在下面的代码段中,我们将告诉new在地址 0x123123初始化一个对象,我们0x123123个数量分配内存Obj的。这通常被称为“placement-new”

Obj * p = new (0x123123) Obj;

答案 2 :(得分:1)

在执行任何操作之前,您应该仔细查看代码。 <击>     void print()     {       R =(规则**)malloc(sizeof(规则*)* num_rules);       memset(R,0,sizeof(rules *)* num_rules);       R [0] =&amp; S;       Ri = 1;

  for (int i = 0; i < Ri; i ++) {
    cout << i << " -> ";
    p(R[i]);
  }
  free(R);
}

仔细看看。请特别注意它为num_rules指针分配空间这一事实,但实际上只有使用完全这些指针的一个R[0])。 / p>

不是重写代码以便从malloc更改为new,而是应该完全消除动态分配,并在此过程中大量简化代码,得到如下内容:

void print() { 
    cout << "0 -> " << p(&S);
}

我想我应该添加我没有彻底分析p - 我想它实际上可能正在使用分配的额外数据。如果是这样,代码需要更严肃的重写 - 这是一个太可怕的允许(并且,不幸的是,RRi是全局的事实表明这很可能。)< / p>

底线:无论你如何看待它,你都在这里攻击错误的问题。 mallocnew完全不相同。

如果你决定进行更改,看起来你可以在这里使用std::vector而没有任何问题。

void print() { 
    std::vector<rules *> R(num_rules);

    R[0] = &S;

    // ...
}

编辑:在p看一点,看起来我的第二个想法是合理的 - 我很确定第一次重写不会正常工作。 p不仅使用R中的剩余空格,而且修改Ri,因此最初看起来像只执行一次的循环将真正执行多次。

结论:打电话给写这个烂摊子的人是一个毫无价值的愚蠢白痴,这将是对无价值的愚蠢白痴的侮辱。