使用 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 文件。 templateb = 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
的构造函数。分配器函数具有签名:
换句话说,任何你放在括号里的东西都会被传递为
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() 分配的指针实例化一个类 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
C#中的结构体要使用new来实例化吗?还是直接声明后直接使用?