c++new的用法

 我来答
别名纯7
2022-11-09 · 超过46用户采纳过TA的回答
知道小有建树答主
回答量:285
采纳率:29%
帮助的人:7.6万
展开全部

c++new的用法

1、new operator

这个就是平时最经常用的new,用法如下程序所示:

 1 class A

 2 {

 3 public:

 4     A(int i) :a(i){}

 5 private:

 6     int a;

 7 };

 8 

 9 int main()

10 {

11     A* example = new A(1);

12 }

new operator实际上执行了以下三个步骤:

1、调用operator new分配内存(后面要说的第二种new),如果类本身定义了operator new,那么会调用类自己的operator new,而不是全局的;

2、调用A的构造函数A::A(int);

3、返回相应的指针

2、operator new

operator new不调用构造函数,而仅仅分配内存,有两个版本,前者抛出异常,后者当失败时不抛出异常,而是直接返回:

void* operator new (std::size_t size);

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

可以看到,operator new的作用有点类似与C语言中的malloc,有的地方说operator new的底层实现可以是malloc。

C++中可以用set_new_handler()设置抛出bad_alloc()异常时调用的处理函数,<<Effective C++>>有几个条款很详细描述了具体做法。

 

1 class A

 2 {

 3 public:

 4     A(int i) :a(i){}

 5     void* operator new(size_t size)

 6     {

 7         cout << "call A::operator new" << endl;

 8         return malloc(size);

 9     }

10     void operator delete(void* p)

11     {

12         cout << "call A::operator delete" << endl;

13         return free(p);

14     }

15     void* operator new(size_t size, const nothrow_t& nothrow_value) noexcept

16     {

17         cout << "call A::operator new (noexcept)" << endl;

18         return malloc(size);

19     }

20     void operator delete(void* p, const nothrow_t& nothrow_value) noexcept

21     {

22         cout << "call A::operator delete (noexcept)" << endl;

23         free(p);

24     }

25 private:

26     int a;

27 };

28 

29 int main()

30 {

31     A* example1 = new A(1);

32     delete example1;

33     A* example2 = new(nothrow) A(2);

34     delete example2;

35 }

用一个小例子可以证明一下,确实调用的是自定义operator new/delete,而不是全局的。

3、placement new

placement new仅在一个已经分配好的内存指针上调用构造函数,基本形式如下:

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

placement new不需要抛出异常,因为它自身不分配内存。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式