使用 malloc() 分配的指针实例化一个类 [重复]

Posted

技术标签:

【中文标题】使用 malloc() 分配的指针实例化一个类 [重复]【英文标题】:Instantiating a class, using a pointer allocated by malloc() [duplicate] 【发布时间】:2012-03-14 18:45:57 【问题描述】:

可能重复:C++'s “placement new”Help with a c++ statement

我在一个产品中工作,其中大部分模块都是用C编写的。其中,一两个模块是用C++编写的。我在 C++ 模块中找到以下代码,但我无法理解发生了什么。

a = (char *) malloc (size);
b = new (a) MyClass();

谁能解释一下 malloc 分配的指针如何用于 new 运算符?合法吗?

谢谢!

【问题讨论】:

Help with a c++ statement、What is this second new?、Explanation of this new() statement 的可能副本 太棒了...我在 STL 代码中看到了相反的情况,显式调用析构函数,我想知道那是什么......这是来自 STL 的 xmemory.cc 文件。 template inline void _Construct(_Ty1 _FARQ *_Ptr) // 在 _Ptr 处使用默认值构造对象 void _FARQ *_Vptr = _Ptr; ::新(_Vptr)_Ty1(); // 模板函数 _Destroy template inline void _Destroy(_Ty _FARQ *_Ptr) // 在 _Ptr 处销毁对象 _Ptr->~_Ty(); 【参考方案1】:

b = new (a) MyClass(); 被称为 placement new,它在预先分配的内存(指针a 指向的内存)上构造MyClass 类型的新对象。

你也应该检查这个问题:What uses are there for "placement new"?

【讨论】:

【参考方案2】:

new 可以带参数,它告诉 new 内存的起始地址......所以代码正在做的是......

a = (char *) malloc (size);

分配新类的内存...

b = new (a) MyClass();

告诉new使用'a'作为内存的起始地址,并在'a'的地址初始化class ...

【讨论】:

【参考方案3】:

语法new (<i>something</i>) Type称为放置 新的。像所有new 一样,它调用一个分配器函数,然后 Type 的构造函数。分配器函数具有签名:

void* operator new( size_t byteCount, something );

换句话说,任何你放在括号里的东西都会被传递为 operator new 函数的附加参数。

除了通常的operator new 函数外,标准还定义了 另外两个 operator new 函数,它们接受额外的参数:

void* operator new( size_t byteCount, std::nothrow_t ) noexcept;

void* operator new( size_t byteCount, void* where ) noexcept;

请注意,两者都是noexcept。第一个返回一个空指针,如果 分配失败(而不是抛出bad_alloc),第二个 只需返回where。 (第二种也称为安置新。 这导致了无穷无尽的混乱:“安置新”可以 指任何扩展的新的,或者只是采用void*的那个。)

在你的情况下,第二个是正在使用的,虽然我会 认真质疑为什么:如果对象类型有析构函数,你会 必须做的:

b->~MyClass();
free( b );

删除它。 (放置 new 和显式删除通常用于 您希望将分配与初始化分开的情况。在一个 std::vector 的实现,例如容量可以是 大于尺寸。)关于我能看到的唯一原因 就是对象必须在C++中分配,而在C中会被删除 (当然,它有一个微不足道的析构函数——否则,没有 方式C可以正确删除它)。

【讨论】:

以上是关于使用 malloc() 分配的指针实例化一个类 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

mfc 类对象指针

JVM--10--创建对象的步骤对象实例化内存布局访问定位

C#中的结构体要使用new来实例化吗?还是直接声明后直接使用?

C: 被释放的 malloc 错误指针未被分配

为啥在将 malloc() 的指针分配给 char* 时会出现段错误?

STL-空间配置器迭代器traits编程技巧