在new和new []返回的内存上放置新内容

时间:2015-01-07 15:10:03

标签: c++ placement-new

以下是我的测试类: -

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是否是为对象数组进行内存分配的正确方法。这两种方法都是相似的。

2 个答案:

答案 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,你可能会遇到麻烦。