发布于 2011-01-09 17:26:31
你认为两者都可以用来解决同一类问题的想法是正确的,但你忽略了操作符new重载是侵入性的(分配策略在对象中),而放置new不是(分配策略是完全独立的)。
Martin York的回答在这方面提供了一个很好的例子:std::vector<>拥有自己的分配策略,而不需要对类型T添加任何要求。
发布于 2011-01-09 17:14:14
放置新内容
最好的例子是考虑std::vector
vector如何将新项放入数组?
当您将新元素添加到向量的末尾时,它必须使用位置new。
class MyVector
{
char* data;
size_t size;
MyVector() : size(0), data(new char[1000]) {}
// Placement new copy construction of element into array.
void push_back(T const& t) { new (data + (sizeof(T) * size)) T(t); ++size;}
};记住,你不能使用赋值或简单的复制,因为元素在数组中还不存在(即内存空间还不是T(它的值还没有定义)),所以你必须在数组中新建一个T对象。
因此,可以将放置新对象看作是创建容器对象的一种方式。您可以为容器分配比所需更多的空间(并且不对其进行初始化)。然后使用placement new在添加元素时对其进行初始化。
重载新的
当对象具有dynamic storage duration时,重载new允许您控制使用的空间。也许你的预期使用模式不属于正常的使用模式,你想要优化创建/销毁。也许您想要构建自己的垃圾收集(针对特定类型)。
主要不同之处在于:
objects.
概述:
这两个都是语言的角落案例,很少在普通代码中使用(我想我在15年内编写了两个新的重载和一个使用新放置的类(对于实际的生产代码/不包括实验和测试))。
当您需要在现实生活中使用这些构造时,您已经与一个经验丰富的团队合作了几年,可以验证您的设计。
发布于 2011-01-09 17:24:11
就像其他发帖者在上面的链接中所说的那样,placement new将把一个对象放在一个已经分配的内存上。
类(或全局)的重载操作符new将始终从空闲列表( malloc或new)中获取内存。当然,自定义分配器可以重载new运算符,从而在内部使用placement new。
但我看不出操作符new如何替代“placement new”。:-)
此外,由于这个问题的主题有关键字? is?,我认为他们是放置新的和运算符新之间的比较概念。有了这种认知,请注意,通过放置new分配的对象需要不同的析构策略:必须手动调用该对象上的析构函数。(当程序员被强制手动调用析构函数时,这是该语言中唯一的情况)。在重载操作符new的情况下,如果程序员提供重载delete,则将调用重载delete。不过,这里没有手动调用析构函数的命令:一个简单的“delete obj;”就可以做到这一点。
很抱歉我的回答很冗长,但我希望你能明白这一点。
https://stackoverflow.com/questions/4638429
复制相似问题