下面是我的测试类:
class Base
{
public:
int data;
Base(int x) : data(x) {}
};现在,我使用placement new在已经分配的内存上创建对象:
案例_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);案例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是否是为对象数组进行内存分配的正确方式。这两种方法是否相似。
发布于 2015-01-07 23:19:53
引用this page
默认定义通过调用操作符new: operator new (size)来分配内存。
从这个角度来看,结果应该是完全相同的。这两行应该返回一个相同的指针。
正如@Joachim Pileborg指出的那样,你可能应该避免使用operator new,而使用更简单的new Base[4]。
发布于 2015-01-07 23:20:15
回答这个问题的困难在于,在使用placement new是一个好主意之前,游戏中必须有一些“非常奇怪的东西”。如果不知道那是什么,就很难自信地说你正在做的事情是“正确的”。
它们两个都能工作。
使用全局operator new[]是非常没有意义的。它为您提供的所有全局operator new是您(或程序中的一些其他代码)重载它们以执行不同操作的能力,例如从不同的源进行分配。因此,您可能认为对可能很大的分配使用operator new[]是一种稍微好一点的做法,然后您可以在程序中的其他地方为此目的进行优化。但与直接将特定分配器用于特定目的相比,这是一个相当直截了当的工具。我真的不认为这是常见的,但使用全局新一点也不常见。
此外,您没有显示用于释放内存的代码,因此有很多出错的机会。通常,您必须依次调用每个元素的析构函数,然后调用与您使用的new运算符匹配的全局delete运算符。对于你的特定类Base来说,不去析构它实际上并没有什么坏处,但是如果你省略了析构函数调用,然后更改了Base,你可能会遇到麻烦。
https://stackoverflow.com/questions/27822395
复制相似问题