Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用malloc()分配的指针实例化类_C++_C_Object_Malloc_New Operator - Fatal编程技术网

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 );