首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在由new和new[]返回的内存上放置new

在由new和new[]返回的内存上放置new
EN

Stack Overflow用户
提问于 2015-01-07 23:10:03
回答 2查看 99关注 0票数 0

下面是我的测试类:

代码语言:javascript
运行
复制
class Base
{
public:
    int data;
    Base(int x) : data(x) {}
};

现在,我使用placement new在已经分配的内存上创建对象:

案例_1:-

代码语言:javascript
运行
复制
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);

案例2:-

代码语言:javascript
运行
复制
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[]来进行分配。正如我测试的那样,两者都工作得很好:

代码语言:javascript
运行
复制
for(int i = 0; i < 4; i++)
{
    Base* b1 = b;
    cout << (*(b1+i)).data;
}

然而,我感到困惑的是,CASE_1是否是为对象数组进行内存分配的正确方式。这两种方法是否相似。

EN

回答 2

Stack Overflow用户

发布于 2015-01-07 23:19:53

引用this page

默认定义通过调用操作符new: operator new (size)来分配内存。

从这个角度来看,结果应该是完全相同的。这两行应该返回一个相同的指针。

正如@Joachim Pileborg指出的那样,你可能应该避免使用operator new,而使用更简单的new Base[4]

票数 0
EN

Stack Overflow用户

发布于 2015-01-07 23:20:15

回答这个问题的困难在于,在使用placement new是一个好主意之前,游戏中必须有一些“非常奇怪的东西”。如果不知道那是什么,就很难自信地说你正在做的事情是“正确的”。

它们两个都能工作。

使用全局operator new[]是非常没有意义的。它为您提供的所有全局operator new是您(或程序中的一些其他代码)重载它们以执行不同操作的能力,例如从不同的源进行分配。因此,您可能认为对可能很大的分配使用operator new[]是一种稍微好一点的做法,然后您可以在程序中的其他地方为此目的进行优化。但与直接将特定分配器用于特定目的相比,这是一个相当直截了当的工具。我真的不认为这是常见的,但使用全局新一点也不常见。

此外,您没有显示用于释放内存的代码,因此有很多出错的机会。通常,您必须依次调用每个元素的析构函数,然后调用与您使用的new运算符匹配的全局delete运算符。对于你的特定类Base来说,不去析构它实际上并没有什么坏处,但是如果你省略了析构函数调用,然后更改了Base,你可能会遇到麻烦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27822395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档