#include<new>
using namespace std;
const int chunk=16;
class TFoo
{
public:
int val(){return _val;};
TFoo(){_val=1;};
private:
int _val;
};
//预分配内存,但没有TFoo对象
char *buf=new char[sizeof(TFoo)*chunk];//这里用int等类型,不影响结果。为什么?
int main()
{
//在buf中创建一个TFoo对象
TFoo *pb=new(buf) TFoo;
//检查一个对象是否被放在buf中
if(pb->val()==1)
cout<<"new expression worked!"<<endl;
delete[] buf;
return 0;
}
上面已经有一个问题了,还有,有谁知道定位new操作符有咱们什么实际的用途啊?
4 个解决方案
#1
首先在类TFoo中因为只有一个int型成员变量因此sizeof(TFoo)与sizeof(int)是相同的。
定位new操作符可以用在类没有提供缺省的构造函数时,而你需要声明一个对象数组,就可以先预分配内存而不调用构造函数,然后使用定位new操作符来在调用构造函数把对象分配在前面预分配的内存中,详情见《More Effective C++》条款4
定位new操作符可以用在类没有提供缺省的构造函数时,而你需要声明一个对象数组,就可以先预分配内存而不调用构造函数,然后使用定位new操作符来在调用构造函数把对象分配在前面预分配的内存中,详情见《More Effective C++》条款4
#2
char *buf=new char[sizeof(TFoo)*chunk];//这里用int等类型,不影响结果。为什么?
因为我们需要的只是一段存储空间,并不关心它是如何被解释的
谁知道定位new操作符有咱们什么实际的用途啊?
其实你上面的代码就是一个应用,它可以用来定义你自己的new操作符。这样你可以非常高效的用你自己的new来为你的自定义类分配空间
因为我们需要的只是一段存储空间,并不关心它是如何被解释的
谁知道定位new操作符有咱们什么实际的用途啊?
其实你上面的代码就是一个应用,它可以用来定义你自己的new操作符。这样你可以非常高效的用你自己的new来为你的自定义类分配空间
#3
用到时才分配内存空间,不象静态的,一开始就分配好了
#4
char *buf=new char[sizeof(TFoo)*chunk];这个随便开辟,
TFoo *pb=new(buf) TFoo;// 这里会调用默认的ctor
TFoo *pb=new(buf) TFoo;// 这里会调用默认的ctor
#1
首先在类TFoo中因为只有一个int型成员变量因此sizeof(TFoo)与sizeof(int)是相同的。
定位new操作符可以用在类没有提供缺省的构造函数时,而你需要声明一个对象数组,就可以先预分配内存而不调用构造函数,然后使用定位new操作符来在调用构造函数把对象分配在前面预分配的内存中,详情见《More Effective C++》条款4
定位new操作符可以用在类没有提供缺省的构造函数时,而你需要声明一个对象数组,就可以先预分配内存而不调用构造函数,然后使用定位new操作符来在调用构造函数把对象分配在前面预分配的内存中,详情见《More Effective C++》条款4
#2
char *buf=new char[sizeof(TFoo)*chunk];//这里用int等类型,不影响结果。为什么?
因为我们需要的只是一段存储空间,并不关心它是如何被解释的
谁知道定位new操作符有咱们什么实际的用途啊?
其实你上面的代码就是一个应用,它可以用来定义你自己的new操作符。这样你可以非常高效的用你自己的new来为你的自定义类分配空间
因为我们需要的只是一段存储空间,并不关心它是如何被解释的
谁知道定位new操作符有咱们什么实际的用途啊?
其实你上面的代码就是一个应用,它可以用来定义你自己的new操作符。这样你可以非常高效的用你自己的new来为你的自定义类分配空间
#3
用到时才分配内存空间,不象静态的,一开始就分配好了
#4
char *buf=new char[sizeof(TFoo)*chunk];这个随便开辟,
TFoo *pb=new(buf) TFoo;// 这里会调用默认的ctor
TFoo *pb=new(buf) TFoo;// 这里会调用默认的ctor