new()语句的解释
Explanation of this new() statement
我正在检查一段c++代码,然后我遇到了这个语句块:
static void Vector3DefaultConstructor(Vector3 *self)
{
new(self) Vector3();
}
我以前没有遇到过这样使用新的操作符。有人能解释一下为什么new这样叫吗?
这叫做"placement new
"。默认情况下,它不分配内存,而是在给定位置(这里是self
)构造对象。但是,它可以为类重载。
更多信息请参见FAQ
销毁使用位置new
构造的对象的正确方法是直接调用析构函数:
obj->~Vector3();
谁能解释一下为什么new这样叫?
我可以告诉你它的作用。它有效地调用任意内存块上的构造函数,从而在该内存块上构造对象。常规new
既分配内存又在内存中构造对象;new位置只完成后一部分。
为什么有人会写那个代码?没有线索。如果对象采用void*
而不是Vector3*
,则更有意义。但是,除非Vector3::Vector3()
是私有的,否则没有理由在像这样的静态函数中隐藏放置新用法。
真实示例:std::vector
分配了足够多的内存来存储其当前负载,以降低push_back
的平均成本。
如果它存储了一个T*data
缓冲区,那么调用data=new T[capacity]
将默认构造一个T
对象的加载。问题是,vector
的语义是它只包含你放入它的东西:我们可以为我们的对象预分配内存,但是这些对象应该还不存在。
解决方案是使vector::data
成员为void*
,并为其分配无类型内存。现在,每当向容器中添加对象时,都需要构造该对象,以便使该对象存在并赋予原始指针意义。
template <typename T>
void vector <T> :: push_back (const T & value)
{
resize (m_size + 1);
// construct a new T in the void buffer.
new (reinterpret_cast <T*> (m_data) + m_size) T (value);
++ m_size;
}
template <typeame T>
void vector <T> :: pop_back ()
{
(reinterpret_cast <T*> (m_data) + m_size) -> ~ T ();
-- size;
}
相关文章:
- 请解释"函数1(p1,p2,p3);"的输出
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- 被解释为低级别const的const对象的地址
- Insert函数不适用于2 if语句C++
- 在 C++ 中解释多维向量的语句时感到困惑
- 有人可以解释一下吗?这是关于数组和数组内部 if 语句的一些处理
- 如何强制新操作员根据我的需要解释语句
- 返回指针的语句 - 解释它是如何工作的以及为什么
- 当我做出语句 root->right->right = newnode(7);注释,编译器显示运行时错误。谁能解释为什么?
- 谁能解释一下递归结束后这些语句是如何执行的
- C ++ if else 语句在开关大小写 - 解释
- 解释 c++ 中语句和表达式之间的区别
- 类c编译器如何解释if语句
- 请解释这段代码(返回语句)
- new()语句的解释
- 有人能解释一下这个特殊的打印语句在for循环中做了什么吗