以下是我的测试类: -
class Base
{
public:
int data;
Base(int x) : data(x) {}
};
现在,我使用placement new在已分配的内存上创建对象: -
CASE_1: -
void* raw = operator new(4* sizeof(Base));
Base* b = static_cast<Base*>(raw);
for(int i = 0; i < 4; i++)
new (&b[i]) Base(i);
CASE_2: -
void* raw = operator new[](4* sizeof(Base)); <<<<<<<<<<<<<
Base* b = static_cast<Base*>(raw);
for(int i = 0; i < 4; i++)
new (&b[i]) Base(i);
在CASE_1中,我使用普通new
来分配足够的内存,而在Case_2中,我使用new[]
来进行分配。我测试时两者都运行正常: -
for(int i = 0; i < 4; i++)
{
Base* b1 = b;
cout << (*(b1+i)).data;
}
但是,我很困惑CASE_1是否是为对象数组进行内存分配的正确方法。这两种方法都是相似的。
答案 0 :(得分:0)
引用this page:
默认定义通过调用operator new ::: operator new(size)来分配内存。
从这一点来看,结果应该完全相同。两行都应返回相同的指针。
正如@Joachim Pileborg指出的那样,你应该避免operator new
并使用更简单的new Base[4]
。
答案 1 :(得分:0)
回答这个问题的困难在于,在使用贴牌之前必须有一些“非常奇怪的东西”是一个好主意。不知道那是什么东西,很难肯定地说你正在做的事情是“正确的”。
他们同时工作。
使用全局operator new[]
毫无意义。它为您提供的全局operator new
能够让您(或程序中的其他代码)重载它们以执行不同的操作,例如从不同的源分配。因此,您可能会认为将operator new[]
用于可能较大的分配稍微好一点,然后您可以在程序的其他位置为此目的进行优化。但与直接使用特定分配器用于特定目的相比,这是一个相当钝的工具。我真的不认为这很常见,但是在所有中使用全局新的并不常见。
此外,您不会显示释放内存的代码,因此有很多机会让它出错。通常,您必须依次调用每个元素的析构函数,然后调用与您使用的新运算符匹配的全局删除运算符。对于你的特定类Base
,实际上没有破坏它是没有害处的,但是如果省略析构函数调用并稍后更改Base
,你可能会遇到麻烦。