616 lines
61 KiB
HTML
616 lines
61 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>operator new, operator new[]</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_memory_new_operator_new skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">operator</span> new<span style="font-size:0.7em; line-height:130%">, operator</span> new[]</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-memory.html">memory</a>‎ | <a href="cpp-memory-new.html">new</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><a href="cpp-header-new.html"><new></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl-h">
|
|
<td>
|
|
<div>可替换分配函数
|
|
<table class="t-rev-begin t-rev-begin-noborder">
|
|
<tr class="t-rev t-since-cxx20">
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">[</span><span class="br0">[</span>nodiscard<span class="br0">]</span><span class="br0">]</span></span></span></p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new <span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(1)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(2)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new <span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, <a href="cpp-memory-new-align_val_t.html"><span class="kw695">std::<span class="me2">align_val_t</span></span></a> al<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(3)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, <a href="cpp-memory-new-align_val_t.html"><span class="kw695">std::<span class="me2">align_val_t</span></span></a> al<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(4)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl-h">
|
|
<td>
|
|
<div>可替换不抛出分配函数
|
|
<table class="t-rev-begin t-rev-begin-noborder">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">noexcept</span></span></span></p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin t-rev-begin-noborder">
|
|
<tr class="t-rev t-since-cxx20">
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">[</span><span class="br0">[</span>nodiscard<span class="br0">]</span><span class="br0">]</span></span></span></p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new <span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, <span class="kw4">const</span> <a href="cpp-memory-new-nothrow_t.html"><span class="kw694">std::<span class="me2">nothrow_t</span></span></a><span class="sy3">&</span> tag<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(5)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, <span class="kw4">const</span> <a href="cpp-memory-new-nothrow_t.html"><span class="kw694">std::<span class="me2">nothrow_t</span></span></a><span class="sy3">&</span> tag<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(6)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new <span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count,<br />
|
|
<a href="cpp-memory-new-align_val_t.html"><span class="kw695">std::<span class="me2">align_val_t</span></span></a> al, <span class="kw4">const</span> <a href="cpp-memory-new-nothrow_t.html"><span class="kw694">std::<span class="me2">nothrow_t</span></span></a><span class="sy3">&</span><span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(7)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count,<br />
|
|
<a href="cpp-memory-new-align_val_t.html"><span class="kw695">std::<span class="me2">align_val_t</span></span></a> al, <span class="kw4">const</span> <a href="cpp-memory-new-nothrow_t.html"><span class="kw694">std::<span class="me2">nothrow_t</span></span></a><span class="sy3">&</span><span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(8)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl-h">
|
|
<td>
|
|
<div>不分配布置分配函数
|
|
<table class="t-rev-begin t-rev-begin-noborder">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">noexcept</span></span></span></p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin t-rev-begin-noborder">
|
|
<tr class="t-rev t-since-cxx20">
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">[</span><span class="br0">[</span>nodiscard<span class="br0">]</span><span class="br0">]</span></span></span></p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new <span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, <span class="kw4">void</span><span class="sy2">*</span> ptr <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(9)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, <span class="kw4">void</span><span class="sy2">*</span> ptr <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(10)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl-h">
|
|
<td>
|
|
<div>用户定义布置分配函数</div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new <span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, user<span class="sy2">-</span>defined<span class="sy2">-</span>args... <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(11)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, user<span class="sy2">-</span>defined<span class="sy2">-</span>args... <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(12)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new <span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count,<br />
|
|
<a href="cpp-memory-new-align_val_t.html"><span class="kw695">std::<span class="me2">align_val_t</span></span></a> al, user<span class="sy2">-</span>defined<span class="sy2">-</span>args... <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(13)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> operator new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count,<br />
|
|
<a href="cpp-memory-new-align_val_t.html"><span class="kw695">std::<span class="me2">align_val_t</span></span></a> al, user<span class="sy2">-</span>defined<span class="sy2">-</span>args... <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(14)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl-h">
|
|
<td>
|
|
<div>类特定分配函数</div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> T<span class="sy4">::</span><span class="me2">operator</span> new <span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(15)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> T<span class="sy4">::</span><span class="me2">operator</span> new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(16)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> T<span class="sy4">::</span><span class="me2">operator</span> new <span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, <a href="cpp-memory-new-align_val_t.html"><span class="kw695">std::<span class="me2">align_val_t</span></span></a> al <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(17)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> T<span class="sy4">::</span><span class="me2">operator</span> new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, <a href="cpp-memory-new-align_val_t.html"><span class="kw695">std::<span class="me2">align_val_t</span></span></a> al <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(18)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl-h">
|
|
<td>
|
|
<div>类特定布置分配函数</div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> T<span class="sy4">::</span><span class="me2">operator</span> new <span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, user<span class="sy2">-</span>defined<span class="sy2">-</span>args... <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(19)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> T<span class="sy4">::</span><span class="me2">operator</span> new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count, user<span class="sy2">-</span>defined<span class="sy2">-</span>args... <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(20)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> T<span class="sy4">::</span><span class="me2">operator</span> new <span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count,<br />
|
|
<a href="cpp-memory-new-align_val_t.html"><span class="kw695">std::<span class="me2">align_val_t</span></span></a> al, user<span class="sy2">-</span>defined<span class="sy2">-</span>args... <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(21)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span> T<span class="sy4">::</span><span class="me2">operator</span> new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> count,<br />
|
|
<a href="cpp-memory-new-align_val_t.html"><span class="kw695">std::<span class="me2">align_val_t</span></span></a> al, user<span class="sy2">-</span>defined<span class="sy2">-</span>args... <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(22)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>分配请求数量的字节。这些分配函数为 <a href="cpp-language-new.html">new 表达式</a>所调用,以分配将被初始化的对象所在的内存。亦可用常规函数调用语法调用它们。</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> 为非数组 <a href="cpp-language-new.html">new 表达式</a>所调用,以分配为单个对象请求的存储。标准库实现从自由存储分配 <code>count</code> 字节。失败情况下,标准库实现调用 <span class="t-lc"><a href="cpp-memory-new-get_new_handler.html">std::get_new_handler</a></span> 所返回的函数指针,并重复尝试分配,直到 new 处理函数不返回或成为空指针,在该时刻抛出 <span class="t-lc"><a href="cpp-memory-new-bad_alloc.html">std::bad_alloc</a></span> 。要求此函数返回指向拥有请求大小的对象的适当对齐的指针。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 为 <a href="cpp-language-new.html">new[] 表达式</a>的数组形式所调用,以分配为数组请求的所有存储(包含可能的 <i>new 表达式</i>开销)。标准库实现调用版本 <span class="t-v">(1)</span></div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 为非数组 <a href="cpp-language-new.html">new 表达式</a>调用,以分配对齐要求超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 的单个对象所要求的存储</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 为 <a href="cpp-language-new.html">new[] 表达式</a>的数组形式调用,以分配对齐要求超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 的对象数组要求的所有存储</div>
|
|
<div class="t-li1"><span class="t-li">5)</span> 为不抛出非数组 <a href="cpp-language-new.html">new 表达式</a>所调用。标准库实现调用版本 <span class="t-v">(1)</span> 并在失败时不传播异常而抛出空指针。</div>
|
|
<div class="t-li1"><span class="t-li">6)</span> 为 <a href="cpp-language-new.html">new[] 表达式</a>的不抛出数组形式所调用。标准库实现调用版本 <span class="t-v">(2)</span> 并在失败时不传播异常而抛出空指针。</div>
|
|
<div class="t-li1"><span class="t-li">7)</span> 在对象对齐要求超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 时为不抛出非数组 <a href="cpp-language-new.html">new 表达式</a>所调用。标准库实现调用版本 <span class="t-v">(3)</span> 并在失败时不传播异常而抛出空指针。</div>
|
|
<div class="t-li1"><span class="t-li">8)</span> 在数组元素的对齐要求超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 时为 <a href="cpp-language-new.html">new[] 表达式</a>的不抛出数组形式所调用。标准库实现调用版本 <span class="t-v">(4)</span> 并在失败时不传播异常而抛出空指针。</div>
|
|
<div class="t-li1"><span class="t-li">9)</span> 为标准单对象<a href="cpp-language-new.html">布置 new</a> 表达式所调用,标准库实现不进行任何动作并返回不修改的 <code>ptr</code> 。若通过布置 new 表达式调用此函数而 <code>ptr</code> 为空指针则行为未定义。</div>
|
|
<div class="t-li1"><span class="t-li">10)</span> 为标准数组形式<a href="cpp-language-new.html">布置 new</a> 表达式所调用。标准库实现不进行任何动作并返回不修改的 <code>ptr</code> 。若通过布置 new 表达式调用此函数而 <code>ptr</code> 为空指针则行为未定义。</div>
|
|
<div class="t-li1"><span class="t-li">11)</span> 若定义,则为拥有匹配签名的自定义单对象<a href="cpp-language-new.html">布置 new</a> 表达式所调用。若定义类特定版本 <span class="t-v">(19)</span> ,则优先于 <span class="t-v">(11)</span> 调用类特定版本。若用户既不提供 <span class="t-v">(11)</span> 又不提供 <span class="t-v">(19)</span> ,则布置 new 表达式为病式。</div>
|
|
<div class="t-li1"><span class="t-li">12)</span> 若定义,则为拥有匹配签名的自定义数组形式<a href="cpp-language-new.html">布置 new</a> 表达式所调用。若定义类特定版本 <span class="t-v">(20)</span> ,则优先于 <span class="t-v">(12)</span> 调用类特定版本。若用户既不提供 <span class="t-v">(12)</span> 又不提供 <span class="t-v">(20)</span> ,则布置 new 表达式为病式。</div>
|
|
<div class="t-li1"><span class="t-li">13)</span> 若定义,则为拥有匹配签名的自定义单对象<a href="cpp-language-new.html">布置 new</a> 表达式所调用,若对象的对齐要求超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 。若定义类特定版本( <span class="t-v">(15)</span> 或 <span class="t-v">(17)</span> ),则调用之。若既不提供类特定版本又不提供具对齐布置形式(此形式),则替而查找无对齐布置形式 <span class="t-v">(11)</span> 。</div>
|
|
<div class="t-li1"><span class="t-li">14)</span> 若定义,则为拥有匹配签名的自定义数组形式<a href="cpp-language-new.html">布置 new</a> 表达式所调用,若元素的对齐要求超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 。若定义类特定版本(<span class="t-v">(16)</span> 或 <span class="t-v">(18)</span> ),则调用之。若既不提供类特定版本又不提供具对齐布置形式(此形式),则替而查找无对齐布置形式 <span class="t-v">(12)</span> 。</div>
|
|
<div class="t-li1"><span class="t-li">15)</span> 若定义,则为通常的单对象 <a href="cpp-language-new.html">new 表达式</a>所调用,若在分配 T 类型对象。</div>
|
|
<div class="t-li1"><span class="t-li">16)</span> 若定义,则为通常的数组 <a href="cpp-language-new.html">new[] 表达式</a>所调用,若在分配 T 类型对象的数组。</div>
|
|
<div class="t-li1"><span class="t-li">17)</span> 若定义,则为通常的单对象 <a href="cpp-language-new.html">new 表达式</a>所调用,若在分配 T 类型对象,且其对齐要求超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 。若不提供此重载,但提供了无对齐成员形式 <span class="t-v">(15)</span> ,则调用无对齐成员重载。</div>
|
|
<div class="t-li1"><span class="t-li">18)</span> 若定义,通常的数组 <a href="cpp-language-new.html">new[] 表达式</a>所调用,若在分配 T 类型的对象数组,且其对齐要求超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 。若不提供此重载,但提供了无对齐成员形式 <span class="t-v">(16)</span> ,则调用无对齐成员重载。</div>
|
|
<div class="t-li1"><span class="t-li">19)</span> 若定义,则为拥有匹配签名的自定义单对象<a href="cpp-language-new.html">布置 new</a> 表达式所调用,若在分配 T 类型对象。</div>
|
|
<div class="t-li1"><span class="t-li">20)</span> 若定义,则为拥有匹配签名的自定义数组形式<a href="cpp-language-new.html">布置 new</a> 表达式所调用,若在分配 T 类型对象的数组。</div>
|
|
<div class="t-li1"><span class="t-li">21)</span> 若定义,则为拥有匹配签名的自定义单对象<a href="cpp-language-new.html">布置 new</a> 表达式所调用,若在分配 T 类型对象,且其对齐要求超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 。若不提供此重载,但提供了无对齐成员形式 <span class="t-v">(19)</span> ,则调用无对齐成员重载。</div>
|
|
<div class="t-li1"><span class="t-li">22)</span> 若定义,则为拥有匹配签名的自定义数组形式<a href="cpp-language-new.html">布置 new</a> 表达式所调用,若在分配 T 类型的对象数组,且其对齐要求超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 。若不提供此重载,但提供了无对齐成员形式 <span class="t-v">(20)</span> ,则调用无对齐成员重载。</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0">参数</span></h3>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td>count</td>
|
|
<td>-</td>
|
|
<td>要分配的字节数</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>ptr</td>
|
|
<td>-</td>
|
|
<td>指向要初始化的对象所在的内存区域的指针</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>tag</td>
|
|
<td>-</td>
|
|
<td>用于选择不抛出重载的消歧义标签</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>al</td>
|
|
<td>-</td>
|
|
<td>使用的对齐。若此非有效对齐值,则行为未定义</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.BF.94.E5.9B.9E.E5.80.BC">返回值</span></h3>
|
|
<div class="t-li1"><span class="t-li">1-4)</span> 非空指针,指向拥有至少 <code>size</code> 大小的适当对齐的内存</div>
|
|
<div class="t-li1"><span class="t-li">5-8)</span> 非空指针,指向拥有至少 <code>size</code> 大小的适当对齐的内存,或在失败时为空指针</div>
|
|
<div class="t-li1"><span class="t-li">9-10)</span> <code>ptr</code></div>
|
|
<div class="t-li1"><span class="t-li">11-22)</span> 若函数在分配失败时不返回则同 <span class="t-v">(1-4)</span> ,否则同 <span class="t-v">(5-8)</span></div>
|
|
<h3><span class="mw-headline" id=".E5.BC.82.E5.B8.B8">异常</span></h3>
|
|
<div class="t-li1"><span class="t-li">1-4)</span> 在分配内存失败时抛出 <span class="t-lc"><a href="cpp-memory-new-bad_alloc.html">std::bad_alloc</a></span> <span class="t-rev-inl t-since-cxx11"><span>或任何从 <span class="t-lc"><a href="cpp-memory-new-bad_alloc.html">std::bad_alloc</a></span> 派生的异常</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></span></span></div>
|
|
<div class="t-li1"><span class="t-li">11-22)</span> 若函数在分配失败时不返回则同 <span class="t-v">(1-4)</span> ,否则同 <span class="t-v">(5-8)</span></div>
|
|
<h3><span class="mw-headline" id=".E5.85.A8.E5.B1.80.E6.9B.BF.E6.8D.A2">全局替换</span></h3>
|
|
<p>版本 <span class="t-v">(1-4)</span> 在每个翻译单元隐式声明,即使不包含 <code><new></code> 头文件。版本 <span class="t-v">(1-8)</span> 是<i>可替换</i>的:定义于程序任何位置,在任何源文件的用户提供的拥有相同签名的非成员函数,会替换默认版本。其声明不必可见。</p>
|
|
<p>若程序中为任何可替换分配函数提供多于一个替换版本,或若替换声明带 <code>inline</code> 说明符,则程序非良构,不要求诊断。若替换定义于异于全局命名空间的命名空间中,或它定义为在全局作用域的 static 函数,则程序为非良构。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p>nothrow 版本的标准库实现 <span class="t-v">(5-8)</span> 直接调用对应的抛出版本 <span class="t-v">(1-4)</span> 。抛出的数组版本的标准库实现 <span class="t-v">(2,4)</span> 直接调用对应的单对象版本 <span class="t-v">(1,3)</span> 。故而,替换抛出单对象分配函数足以处理所有分配。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <cstdio></span>
|
|
<span class="co2">#include <cstdlib></span>
|
|
<span class="co2">#include <new></span>
|
|
<span class="co1">// 最小函数集的替换:</span>
|
|
<span class="kw4">void</span><span class="sy2">*</span> operator new<span class="br0">(</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> sz<span class="br0">)</span> <span class="co1">// 无 inline ,由 [replacement.functions]/3 要求</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-io-c-fprintf.html"><span class="kw1843">std::<span class="me2">printf</span></span></a><span class="br0">(</span><span class="st0">"global op new called, size = %zu<span class="es1">\n</span>"</span>, sz<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw1">if</span> <span class="br0">(</span>sz <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">)</span>
|
|
<span class="sy2">++</span>sz<span class="sy4">;</span> <span class="co1">// 避免可能在成功时返回 nullptr 的 std::malloc(0)</span>
|
|
|
|
<span class="kw1">if</span> <span class="br0">(</span><span class="kw4">void</span> <span class="sy2">*</span>ptr <span class="sy1">=</span> <a href="cpp-memory-c-malloc.html"><span class="kw757">std::<span class="me2">malloc</span></span></a><span class="br0">(</span>sz<span class="br0">)</span><span class="br0">)</span>
|
|
<span class="kw1">return</span> ptr<span class="sy4">;</span>
|
|
|
|
<span class="kw1">throw</span> <a href="cpp-memory-new-bad_alloc.html"><span class="kw691">std::<span class="me2">bad_alloc</span></span></a><span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 由 [new.delete.single]/3 要求</span>
|
|
<span class="br0">}</span>
|
|
<span class="kw4">void</span> <a href="cpp-memory-new-operator_delete.html"><span class="kw687">operator delete</span></a><span class="br0">(</span><span class="kw4">void</span><span class="sy2">*</span> ptr<span class="br0">)</span> <span class="kw1">noexcept</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-io-c-puts.html"><span class="kw1828">std::<span class="me2">puts</span></span></a><span class="br0">(</span><span class="st0">"global op delete called"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-memory-c-free.html"><span class="kw761">std::<span class="me2">free</span></span></a><span class="br0">(</span>ptr<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw4">int</span><span class="sy2">*</span> p1 <span class="sy1">=</span> new <span class="kw4">int</span><span class="sy4">;</span>
|
|
delete p1<span class="sy4">;</span>
|
|
|
|
<span class="kw4">int</span><span class="sy2">*</span> p2 <span class="sy1">=</span> new <span class="kw4">int</span><span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="sy4">;</span> <span class="co1">// C++11 中保证调用替换</span>
|
|
delete<span class="br0">[</span><span class="br0">]</span> p2<span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>可能的输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">global op new called, size = 4
|
|
global op delete called
|
|
global op new called, size = 40
|
|
global op delete called</pre></div>
|
|
</div>
|
|
</div>
|
|
<p><code>operator new</code> 与 <code>operator new[]</code> 带额外用户定义参数的重载(“布置形式”,版本 <span class="t-v">(11-14)</span> )可以照常声明于全局作用域,而且为匹配的 <i>new 表达式</i>的布置形式所调用。</p>
|
|
<p>标准库的 operator new 的不分配布置形式 <span class="t-v">(9-10)</span> 不能被替换,而且只若布置 new 表达式不使用 <code>::new</code> 语法才能自定义,通过提供类特定的带匹配签名的布置 new <span class="t-v">(19,20)</span> : <code>void* T::operator new(size_t, void*)</code> 或 <code>void* T::operator new[](size_t, void*)</code> 。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx14">
|
|
<td>
|
|
<p>布置形式 <code>void* operator new(std::size_t, std::size_t)</code> 不被允许,因为对应的解分配函数的匹配签名 <code>void operator delete(void*, std::size_t)</code> 是通常(非布置)的解分配函数。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx14">(C++14 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E7.B1.BB.E7.89.B9.E5.AE.9A.E9.87.8D.E8.BD.BD">类特定重载</span></h3>
|
|
<p>单对象和数组分配函数都可以定义为类的公开静态成员函数(版本 <span class="t-v">(15-18)</span> 。若定义,则 <a href="cpp-language-new.html">new 表达式</a>调用这些函数,以分配此类单个对象或数组的内存,除非 new 表达式使用 <code>::new</code> 形式,这跳过类作用域查找。关键词 <code>static</code> 对这些函数可选:不管是否使用,分配函数都是静态成员函数。</p>
|
|
<p>new 表达式首先在类作用域中查找适当的函数名,然后在全局作用域查找。注意,同每个<a href="cpp-language-lookup.html">名称查找规则</a>,就试图分配此类对象的 new 表达式而言,任何声明于类作用域的分配函数隐藏所有全局分配函数。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx17">
|
|
<td>
|
|
<p>在分配对齐超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 的对象或对象数组时,进行二次重载决议:首先,针对具对齐的函数签名,然后,针对无对齐的函数签名。这表示若拥有扩展对齐的类拥有无对齐量的类特定分配函数,则将被调用者是该函数,而非全局的具对齐分配函数。这是有意的:期待类成员对如何处理该类的理解是最好的。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <iostream></span>
|
|
<span class="co1">// 类特定分配函数</span>
|
|
<span class="kw1">struct</span> X <span class="br0">{</span>
|
|
<span class="kw4">static</span> <span class="kw4">void</span><span class="sy2">*</span> operator new<span class="br0">(</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> sz<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1756">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"custom new for size "</span> <span class="sy1"><<</span> sz <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="kw1">return</span> <span class="sy4">::</span><span class="me2">operator</span> new<span class="br0">(</span>sz<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="kw4">static</span> <span class="kw4">void</span><span class="sy2">*</span> operator new<span class="br0">[</span><span class="br0">]</span><span class="br0">(</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> sz<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1756">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"custom new[] for size "</span> <span class="sy1"><<</span> sz <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="kw1">return</span> <span class="sy4">::</span><span class="me2">operator</span> new<span class="br0">(</span>sz<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
|
|
X<span class="sy2">*</span> p1 <span class="sy1">=</span> new X<span class="sy4">;</span>
|
|
delete p1<span class="sy4">;</span>
|
|
X<span class="sy2">*</span> p2 <span class="sy1">=</span> new X<span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="sy4">;</span>
|
|
delete<span class="br0">[</span><span class="br0">]</span> p2<span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>可能的输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">custom new for size 1
|
|
custom new[] for size 10</pre></div>
|
|
</div>
|
|
</div>
|
|
<p><code>operator new</code> 与 <code>operator new[]</code> 带额外用户定义参数(“布置形式”)的重载,亦可定义为类成员 <span class="t-v">(19-22)</span> 。在拥有匹配签名的布置 new 表达式查找要调用的对应分配函数时,查找在检验全局作用域前,从类作用域开始,而若提供了类特定的布置 new 则调用它。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx17">
|
|
<td>
|
|
<p>在分配对齐超出 <code>__STDCPP_DEFAULT_NEW_ALIGNMENT__</code> 的对象或对象数组时,布置形式的重载决议如常规形式一样执行二次:首先,对有对齐量的函数签名,然后,对无对齐量的函数签名。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <stdexcept></span>
|
|
<span class="co2">#include <iostream></span>
|
|
<span class="kw1">struct</span> X <span class="br0">{</span>
|
|
X<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">throw</span> <a href="cpp-error-runtime_error.html"><span class="kw768">std::<span class="me2">runtime_error</span></span></a><span class="br0">(</span><span class="st0">""</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span>
|
|
<span class="co1">// 自定义布置 new</span>
|
|
<span class="kw4">static</span> <span class="kw4">void</span><span class="sy2">*</span> operator new<span class="br0">(</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> sz, <span class="kw4">bool</span> b<span class="br0">)</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1756">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"custom placement new called, b = "</span> <span class="sy1"><<</span> b <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="kw1">return</span> <span class="sy4">::</span><span class="me2">operator</span> new<span class="br0">(</span>sz<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="co1">// 自定义布置 delete</span>
|
|
<span class="kw4">static</span> <span class="kw4">void</span> <a href="cpp-memory-new-operator_delete.html"><span class="kw687">operator delete</span></a><span class="br0">(</span><span class="kw4">void</span><span class="sy2">*</span> ptr, <span class="kw4">bool</span> b<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1756">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"custom placement delete called, b = "</span> <span class="sy1"><<</span> b <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="sy4">::</span><a href="cpp-memory-new-operator_delete.html"><span class="kw687">operator delete</span></a><span class="br0">(</span>ptr<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="kw1">try</span> <span class="br0">{</span>
|
|
X<span class="sy2">*</span> p1 <span class="sy1">=</span> new <span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span> X<span class="sy4">;</span>
|
|
<span class="br0">}</span> <span class="kw1">catch</span><span class="br0">(</span><span class="kw4">const</span> <a href="cpp-error-exception.html"><span class="kw762">std::<span class="me2">exception</span></span></a><span class="sy3">&</span><span class="br0">)</span> <span class="br0">{</span> <span class="br0">}</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">custom placement new called, b = 1
|
|
custom placement delete called, b = 1</pre></div>
|
|
</div>
|
|
</div>
|
|
<p>若类级别的 <code>operator new</code> 是模板函数,则它必须拥有返回类型 <code>void*</code> ,第一参数类型 <code>std::size_t</code> ,且它必须拥有二个或更多参数。换言之,仅布置形式能是模板。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>尽管不分配布置 new <span class="t-v">(9,10)</span> 不能被替换,亦可在上面描述的类作用域定义拥有相同签名的函数。而且,像是布置 new 但接受非 void 指针类型作为第二参数的全局重载是的受到允许的,故意图确保调用真的布置 new 的代码(例如 <span class="t-lc"><a href="cpp-memory-allocator-construct.html">std::allocator::construct</a></span> )必须使用 <code>::new</code> 并将指针转型到 <code>void*</code> 。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p>要求下列函数是线程安全的:</p>
|
|
<ul>
|
|
<li><strong class="selflink"><tt>operator new</tt></strong> 及 <a href="cpp-memory-new-operator_delete.html"><tt>operator delete</tt></a> 的库版本</li>
|
|
<li>全局 <strong class="selflink"><tt>operator new</tt></strong> 与 <a href="cpp-memory-new-operator_delete.html"><tt>operator delete</tt></a> 的用户替换版本</li>
|
|
<li><span class="t-lc"><a href="cpp-memory-c-calloc.html">std::calloc</a></span> 、 <span class="t-lc"><a href="cpp-memory-c-malloc.html">std::malloc</a></span> 、 <span class="t-lc"><a href="cpp-memory-c-realloc.html">std::realloc</a></span> <span class="t-rev-inl t-since-cxx17"><span>、 <span class="t-lc"><a href="cpp-memory-c-aligned_alloc.html">std::aligned_alloc</a></span></span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span> 、 <span class="t-lc"><a href="cpp-memory-c-free.html">std::free</a></span></li>
|
|
</ul>
|
|
<p>对这些分配或解分配特定存储单元的函数调用以单独全序出现,并且在此顺序中,每个解分配调用<a href="cpp-atomic-memory_order.html">先发生于</a>下个分配(若存在)。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p><code>operator new</code> 的库版本是否产生任何对 <span class="t-lc"><a href="cpp-memory-c-malloc.html">std::malloc</a></span> <span class="t-rev-inl t-since-cxx17"><span>或 <span class="t-lc"><a href="cpp-memory-c-aligned_alloc.html">std::aligned_alloc</a></span></span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span> 的调用是未指定的。</p>
|
|
<p>对于加载大文件,经由如 POSIX 上的 <a rel="nofollow" class="external text" href="https://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html"><code>mmap</code></a> 或 Windows 上的 <code>CreateFileMapping</code>(<a rel="nofollow" class="external text" href="https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createfilemappinga"><code>A</code></a>/<a rel="nofollow" class="external text" href="https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-createfilemappingw"><code>W</code></a>) 伴随 <a rel="nofollow" class="external text" href="https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-mapviewoffile"><code>MapViewOfFile</code></a> 的操作系统特定函数进行文件映射,比为文件读取分配缓冲区更适合。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
|
|
<tr>
|
|
<td class="mbox-empty-cell"></td>
|
|
<td class="mbox-text" style="">本节未完成<br />
|
|
原因:暂无示例</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-new-operator_delete.html"><span class="t-lines"><span>operator delete</span><span>operator delete[]</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>解分配函数<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-new-get_new_handler.html"><span class="t-lines"><span>get_new_handler</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>获得当前的 new 处理函数<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-new-set_new_handler.html"><span class="t-lines"><span>set_new_handler</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>注册一个 new 处理函数<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-get_temporary_buffer.html"><span class="t-lines"><span>get_temporary_buffer</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-deprecated-cxx17">(C++17 中弃用)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>获得未初始化存储<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-c-malloc.html"><span class="t-lines"><span>malloc</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>分配内存<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-c-aligned_alloc.html"><span class="t-lines"><span>aligned_alloc</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx17">(C++17)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>分配对齐的内存<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-c++11">
|
|
<ul>
|
|
<li>C++11 标准(ISO/IEC 14882:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>18.6 Dynamic memory management [support.dynamic]</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|