http://sequitur.info/sequitur_simple.cc
处有一段代码我更改了malloc
和free
行
R = (rules **) malloc(sizeof(rules *) * num_rules);
free(R);
到new
和delete
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]
答案 0 :(得分:4)
假设你的变量类型是正确的,它应该是
R = new rules*[num_rules];
稍后,当您要释放它时,请使用
delete[] R;
但很可能,OP正在尝试解决这里的“错误”问题(在设计这段代码时所做的假设可能不正确......)。 有关更多详细信息,请参阅Jerry Coffin的回答here
关于何时使用new
功能(展示位置新功能),请参阅refp的回答here
答案 1 :(得分:3)
malloc
和new
都分配存储,但它们大不相同,不仅在逻辑上,而且在语法上也是如此。一个是普通函数,另一个是运算符。
要为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
- 我想它实际上可能正在使用分配的额外数据。如果是这样,代码需要更严肃的重写 - 这是一个太可怕的允许(并且,不幸的是,R
和Ri
是全局的事实表明这很可能。)< / p>
底线:无论你如何看待它,你都在这里攻击错误的问题。 malloc
与new
完全不相同。
如果你决定进行更改,看起来你可以在这里使用std::vector
而没有任何问题。
void print() {
std::vector<rules *> R(num_rules);
R[0] = &S;
// ...
}
编辑:在p
看一点,看起来我的第二个想法是合理的 - 我很确定第一次重写不会正常工作。 p
不仅使用R
中的剩余空格,而且还修改Ri
,因此最初看起来像只执行一次的循环将真正执行多次。
结论:打电话给写这个烂摊子的人是一个毫无价值的愚蠢白痴,这将是对无价值的愚蠢白痴的侮辱。