对于没有默认构造函数的类,可以使用operator new和placement new来声明此类的数组。
当我阅读更有效的C ++中的代码时,我发现代码如下(我修改了一些部分).....
我的问题是,为什么需要运营商之后的[]?
我没有它测试它,它仍然有效。任何机构都能解释一下吗?
class A {
public:
int i;
A(int i):i(i) {}
};
int main()
{
void *rawMemory = operator new[] (10 * sizeof(A)); // Why [] needed here?
A *p = static_cast<A*>(rawMemory);
for(int i = 0 ; i < 10 ; i++ ) {
new(&p[i])A(i);
}
for(int i = 0 ; i < 10 ; i++ ) {
cout<<p[i].i<<endl;
}
for(int i = 0 ; i < 10 ; i++ ) {
p[i].~A();
}
return 0;
}
答案 0 :(得分:2)
不需要。 operator new和operator new []之间的唯一区别是第一个是通过使用关键字new调用,另一个是通过关键字new []调用。两者都分配原始内存。
只需确保当你最终释放内存(这里的代码只是泄漏)时,你调用删除或删除[]匹配新的或新的[]。
答案 1 :(得分:2)
答案 2 :(得分:1)
在这种情况下并不严格需要。它们都会分配相同数量的内存,但其中一个需要delete
,最后一个需要delete[]
。使用new[]
可以使您的意图更加清晰,这就是为什么在这里使用它。
答案 3 :(得分:0)
它并不是真正需要的 - 如果您选择这样做,它只是让您有机会为单个对象分别为内存分配内存。