zoukankan      html  css  js  c++  java
  • 网易校园招聘c++题目如何让new操作符不分配内存,只调用构造函数

    问题:c++中的new操作符 通常完成两个工作 分配内存及调用相应的构造出世核函数。
    请问:
    1)如何让new操作符不分配内存,只调用构造函数?
    2) 这样的用法有什么用?

    解答:(要求new显式调用构造函数,但不分配内存。)

    题目要求不能生成内存 还要调用构造函数 说明这个类里面没有对内部操作 但可以对外部操作 比如static的数

    摘录:如果我是用new分配对象的,可以显式调用析构函数吗?
    可能不行。除非你使用定位放置 new.

    1. class Fred  
    2. {public:  
    3.       Fred()  
    4.       {  
    5.             cout<<"fuck";  
    6.             }  
    7.         
    8.       };   
    9. int main()  
    10. {  
    11.       
    12.     Fred*f=new((void*)10000)Fred();  
    13.     system("pause");     
    14. }   //其中这个10000可以是任意数,但不能为0  

    2)
    定位放置new(placement new)有很多作用。最简单的用处就是将对象放置在内存中的特殊位置。这是依靠 new表达式部分的指针参数的位置来完成的:

     

    #include <new>        // 必须 #include 这个,才能使用 "placement new"
    #include "Fred.h"     // class Fred 的声明

    void someCode()
    {
       char memory[sizeof(Fred)];     // Line #1
       void* place = memory;          // Line #2

       Fred* f = new(place) Fred(); // Line #3 (详见以下的“危险”)
       // The pointers f and place will be equal

       // ...
    }
    Line #1 在内存中创建了一个sizeof(Fred)字节大小的数组,足够放下 Fred 对象。Line #2 创建了一个指向这块内存的首字节的place指针(有经验的 C 程序员会注意到这一步是多余的,这儿只是为了使代码更明显)。Line #3 本质上只是调用了构造函数 Fred::Fred()。Fred构造函数中的this指针将等于place。因此返回的 f 将等于place。  
    Line #3 本质上只是调用了构造函数 Fred::Fred()。

    *********************************************************

    placement new的作用就是:创建对象但是不分配内存,而是在已有的内存块上面创建对象。

    用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。

    1. #include <iostream>   
    2. #include <new>   
    3. using namespace std;  
    4.   
    5. const int chunk = 16;  
    6. class Foo  
    7. {  
    8. public:  
    9.     int val( ) { return _val; }  
    10.     Foo( ) { _val = 0; }  
    11.   
    12. private:  
    13.     int _val;  
    14. };  
    15.   
    16. //预分配内存,但没有Foo对象   
    17. char*buf = new charsizeof(Foo) * chunk ];  
    18.   
    19. int main()  
    20. {  
    21.     //在buf中创建一个Foo对象   
    22.     Foo*pb = new (buf) Foo;  
    23.   
    24.     //检查一个对象是否被放在buf中   
    25.     if ( pb->val() == 0 )  
    26.     {  
    27.         cout <<"new expression worked!" <<endl;  
    28.     }  
    29.   
    30.     //到这里不能再使用pb   
    31.     delete[] buf;  
    32.   
    33.     return 0;  
    34. }  
  • 相关阅读:
    也URL Rewriter
    一窝蜂的分类信息
    再思考:分类信息的前途
    Ajax的一个体验:Ajax.NET A free library for the Microsoft .NET Framework
    EonerCMS——做一个仿桌面系统的CMS(十三)
    关于IE6、7、8下实现盒阴影的几个注意点
    EonerCMS——做一个仿桌面系统的CMS(十附最新源码)
    EonerCMS——做一个仿桌面系统的CMS(十一)
    用cloudzoom做一个仿淘宝的宝贝放大镜查看功能
    剑走偏锋——用css制作一个三角形箭头
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332949.html
Copyright © 2011-2022 走看看