operator new3种情况详解

【本文链接】

 http://www.cnblogs.com/hellogiser/p/operator-new.html

【代码】

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 
/*
    version: 1.0
    author: hellogiser
    blog: http://www.cnblogs.com/hellogiser
    date: 2014/9/20
*/


#include "stdafx.h"
#include "iostream"
#include <new// for operator new
using namespace std;

/*
throwing (1)
void* operator new (std::size_t size);

nothrow (2)
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept;

placement (3)
void* operator new (std::size_t size, void* ptr) noexcept;
*/


struct MyClass
{
    
int data[100];
    MyClass()
    {
        std::cout << 
"constructed [" << this << "]\n";
    }
};

void test_new_3 ()
{

    std::cout << 
"1: ";
    MyClass *p1 = 
new MyClass;
    
// allocates memory by calling: operator new (sizeof(MyClass))
    // and then constructs an object at the newly allocated space

    std::cout << 
"2: ";
    MyClass *p2 = 
new (std::nothrow) MyClass;
    
// allocates memory by calling: operator new (sizeof(MyClass),std::nothrow)
    // and then constructs an object at the newly allocated space

    std::cout << 
"3: ";
    
new (p2) MyClass;
    
// does not allocate memory -- calls: operator new (sizeof(MyClass),p2)
    // but constructs an object at p2

    
// Notice though that calling this function directly does not construct an object:
    std::cout << "4: ";
    MyClass *p3 = (MyClass *) ::
operator new (sizeof(MyClass));
    
// allocates memory by calling: operator new (sizeof(MyClass))
    // but does not call MyClass's constructor

    
delete p1;
    
delete p2;
    
delete p3;
}

int main()
{
    test_new_3();
    
return 0;
}
/*
1: constructed [0031E690]
2: constructed [0031E958]
3: constructed [0031E958]
4:
*/

【参考】

http://www.cplusplus.com/reference/new/operator%20new/