C++ 使用malloc()分配的指针实例化类
可能重复:C++ 使用malloc()分配的指针实例化类,c++,c,object,malloc,new-operator,C++,C,Object,Malloc,New Operator,可能重复: 我在一个产品中工作,其中大多数模块都是用C编写的,其中一个或两个模块是用C++编写的。我在C++模块中找到下面的代码,我不明白正在发生什么。 a = (char *) malloc (size); b = new (a) MyClass(); 有人能解释一下malloc分配的指针是如何用于新操作符的吗?这合法吗 谢谢 b=new(a)MyClass()被称为placement new,它在预先分配的内存(指针a指向的内存)上构造类型为MyClass的新对象 您还应该检查这个问题
我在一个产品中工作,其中大多数模块都是用C编写的,其中一个或两个模块是用C++编写的。我在C++模块中找到下面的代码,我不明白正在发生什么。
a = (char *) malloc (size);
b = new (a) MyClass();
有人能解释一下malloc分配的指针是如何用于新操作符的吗?这合法吗
谢谢 b=new(a)MyClass()
被称为placement new,它在预先分配的内存(指针a
指向的内存)上构造类型为MyClass
的新对象
您还应该检查这个问题:new can take参数,它告诉new内存的起始地址…因此代码所做的是
a = (char *) malloc (size);
分配新类的内存
b = new (a) MyClass();
告诉new使用'a'作为内存的起始地址,并在'a'的地址初始化CLA…语法新(某物)类型
称为placement
刚出现的与所有new
一样,它调用一个分配器函数,然后调用
类型的构造函数
。分配器函数具有以下签名:
void* operator new( size_t byteCount, something );
及
请注意,两者都是noexcept
。第一个返回空指针,如果
分配失败(而不是抛出错误的分配),第二个
只需返回其中
。(第二种也被称为“新放置”。
这导致了无止境的困惑:“安置新”可以
请参阅任何扩展的新版本,或jsut使用void*
)的版本
在您的情况下,第二个是正在使用的,尽管我会这样做
严肃地问为什么:如果对象类型有析构函数,您将
我们必须做:
b->~MyClass();
free( b );
删除它。(位置新建和显式删除通常用于
要将分配与初始化分离的情况。在
实现std::vector
,例如,容量可以
这是我能看到的唯一原因
对象必须在C++中分配,但将在C中删除
(当然,它有一个微不足道的析构函数,否则,就没有了
方法C可以正确地删除它。)可能的重复,也很好。。。我在STL代码中看到了与此相反的,对析构函数的显式调用,我想知道那是什么。。这来自STL的xmemory.cc文件。模板内联void{u-Ty1{u-FARQ*{u-Ptr}构造对象在{u-Ptr处,默认值为void}u-FARQ*{u-Vptr={u-Ptr;::新建({u-Vptr){u-Ty1();}//模板函数{u-Destroy模板内联void{u-Destroy({u-FARQ*{u-Ptr){//Destroy对象在{u-Ptr}u-Ptr->}
void* operator new( size_t byteCount, void* where ) noexcept;
b->~MyClass();
free( b );