0

在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]
4

3 回答 3

4

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

R = new rules*[num_rules];

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

delete[] R;

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

关于何时new像函数一样使用(放置新),请参阅 refp 的答案here

于 2013-02-22T06:40:03.817 回答
3

malloc并且new两者都分配存储,但它们有很大的不同,不仅在逻辑上而且在语法上也是如此。一个是普通函数,另一个是运算符。


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

rules ** R;

...

R = new rules* [num_rules];

...

delete [] R;

但我见过被new称为函数吗?

并非如此,您可能已经看到看起来像函数调用的东西,但事实并非如此。

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

Obj * p = new (0x123123) Obj;
于 2013-02-22T06:42:10.537 回答
1

这是你真正应该在做任何事情之前仔细查看代码的地方。 void print() { R = (rules **) malloc(sizeof(rules *) * num_rules); memset(R, 0, sizeof(rules *) * num_rules); R[0] = &S; Ri = 1;

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

仔细看看。请特别注意它为num_rules指针分配空间的事实,但实际上只使用其中一个指针 ( R[0])。

与其重写代码以更改 from mallocnew不如完全消除动态分配,并在此过程中大大简化代码,得到如下内容:

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

我想我应该补充一点,我没有进行p非常彻底的分析——我想它实际上可能正在使用分配的额外数据。如果是这样,代码需要更认真的重写——这太可怕了(不幸的是,RandRi是全局变量的事实表明这太可能了)。

底线:无论您如何看待它,您都在这里解决了错误的问题。mallocvs.new是完全错误的地方。

如果您确实决定进行更改,看起来您可以在std::vector此处使用 a 没有任何问题。

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

    R[0] = &S;

    // ...
}

编辑:多看一点p,看起来我的第二个想法是有道理的——我很确定第一次重写不会正常工作。p不仅使用了 中的剩余空间R修改Ri了 ,所以最初看起来只执行一次的循环实际上会执行多次。

结论:把写这个烂摊子的人称为一文不值的白痴将是对一文不值的白痴的侮辱。

于 2013-02-22T06:47:00.013 回答