关于operator new(size_t size)中的size

时间:2021-07-29 09:20:56
   看effective C++内存管理一章时,有类的operator new定义如下(伪代码):
   void * operator new(size_t size)        // operator new还可能有其它参数
   {                                       

       if (size == 0) {                      // 处理0字节请求时,
           size = 1;                           // 把它当作1个字节请求来处理
        }                                     
       while (1) {
       分配size字节内存;

           if (分配成功)
             return (指向内存的指针);

          // 分配不成功,找出当前出错处理函数
            new_handler globalhandler = set_new_handler(0);
           set_new_handler(globalhandler);

           if (globalhandler) (*globalhandler)();
            else throw std::bad_alloc();
       }
   }
若是此类名为student;那么动态分配的正确语法是:student *ptr = new student;么?这样使用,operator new函数中的形参size的值从哪来?size的值是字节数,还是生成对象的个数?分配0字节的动态分配方法又如何使用,是student *ptr = new student[0]么?请依次解答。谢谢

10 个解决方案

#1


这个size是编译器根据申请对象的类型计算的 就是分配内存的大小 不是要你填的

分配0字节??可能么 有意义么  

#2


在书里提到分配0字节的operator new的处理情况。我也不知道这样的使用有什么意义,所以才问。

#3


你误解意思了 0字节是错误的参数 
所以才有
   if (size == 0) {                      // 处理0字节请求时, 
          size = 1;                          // 把它当作1个字节请求来处理 
        }       
这么个处理

#4


 if (size == 0) {                      // 处理0字节请求时, 
          size = 1;                          // 把它当作1个字节请求来处理 
        }   


这个是必须的,  即使是空类也要有1字节的空间   

#5


LZ,,

我想请问一下:
student *ptr = new student。。
这个new 与operator new 一样吗???LZ没有细看书吧???

#6


student *ptr = new student。。
申请内存,,但这里的new不是重载的new,,,,这里内存分配的大小是根据student的大小来的,
还要加上一些系统内部的处理数据,也就是delete释放时所需要的数据。。。

而operator new 是重载new 函数,,分配的空间比上面的new 要小,因而在一定程度上可以
提高程序的性能。。。这里的大小是要函数调用时自己提供的。。。

如:
void * p;
p = operator new(sizeof(int));

#7


分配0字节的动态分配方法又如何使用,是student *ptr = new student[0]么?

正常情况下不可能分配0空间的,,如果size=0的话,也要分配一个字节的空间。。。

至于:student *ptr = new student[0];;这句话是什么意思???有这样的语句???

如果解答不对,请高手指正

#8



class x {
public:
  void f();

  static void * operator new(size_t size, new_handler p);

  static void * operator new(size_t size)
  { return ::operator new(size); }
};

x *px1 =
  new (specialerrorhandler) x;      // 调用 x::operator
                                    // new(size_t, new_handler)

x* px2 = new x;                     // 调用 x::operator
                                    // new(size_t)


#9


size应该为默认的类的大小

#10


引用 5 楼 gezichong 的回复:
LZ,, 

我想请问一下: 
student *ptr = new student。。 
这个new 与operator new 一样吗???LZ没有细看书吧???

使用new时调用的是operator new,应该没错吧?使用operator new就一地你的要用operator new()的形式么?那样我还要问你么

#1


这个size是编译器根据申请对象的类型计算的 就是分配内存的大小 不是要你填的

分配0字节??可能么 有意义么  

#2


在书里提到分配0字节的operator new的处理情况。我也不知道这样的使用有什么意义,所以才问。

#3


你误解意思了 0字节是错误的参数 
所以才有
   if (size == 0) {                      // 处理0字节请求时, 
          size = 1;                          // 把它当作1个字节请求来处理 
        }       
这么个处理

#4


 if (size == 0) {                      // 处理0字节请求时, 
          size = 1;                          // 把它当作1个字节请求来处理 
        }   


这个是必须的,  即使是空类也要有1字节的空间   

#5


LZ,,

我想请问一下:
student *ptr = new student。。
这个new 与operator new 一样吗???LZ没有细看书吧???

#6


student *ptr = new student。。
申请内存,,但这里的new不是重载的new,,,,这里内存分配的大小是根据student的大小来的,
还要加上一些系统内部的处理数据,也就是delete释放时所需要的数据。。。

而operator new 是重载new 函数,,分配的空间比上面的new 要小,因而在一定程度上可以
提高程序的性能。。。这里的大小是要函数调用时自己提供的。。。

如:
void * p;
p = operator new(sizeof(int));

#7


分配0字节的动态分配方法又如何使用,是student *ptr = new student[0]么?

正常情况下不可能分配0空间的,,如果size=0的话,也要分配一个字节的空间。。。

至于:student *ptr = new student[0];;这句话是什么意思???有这样的语句???

如果解答不对,请高手指正

#8



class x {
public:
  void f();

  static void * operator new(size_t size, new_handler p);

  static void * operator new(size_t size)
  { return ::operator new(size); }
};

x *px1 =
  new (specialerrorhandler) x;      // 调用 x::operator
                                    // new(size_t, new_handler)

x* px2 = new x;                     // 调用 x::operator
                                    // new(size_t)


#9


size应该为默认的类的大小

#10


引用 5 楼 gezichong 的回复:
LZ,, 

我想请问一下: 
student *ptr = new student。。 
这个new 与operator new 一样吗???LZ没有细看书吧???

使用new时调用的是operator new,应该没错吧?使用operator new就一地你的要用operator new()的形式么?那样我还要问你么