`
blogfeifei
  • 浏览: 1195805 次
文章分类
社区版块
存档分类
最新评论

如何让new操作符不分配内存,只调用构造函数

 
阅读更多


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

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

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

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

class Fred
{public:
Fred()
{
cout<<"fuck";
}

};
int main()
{

Fred*f=new((void*)10000)Fred();
system("pause");
} 其中这个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的作用就是:创建对象但是不分配内存,而是在已有的内存块上面创建对象。

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

const intchunk = 16;
class Foo
{
public :
int val( ) { return _val; }
Foo( ) { _val = 0; }

private :
int_val;
};

//预分配内存,但没有Foo对象
char*buf = new char[ sizeof(Foo) * chunk ];

int
main( void )
{
//在buf中创建一个Foo对象
Foo*pb = new (buf) Foo;

//检查一个对象是否被放在buf中
if ( pb->val() == 0 )
{
cout <<"new expressio worked!" <<endl;
}

//到这里不能再使用pb
delete[] buf;

return 0;
}


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sws9999/archive/2008/10/02/3009779.aspx

分享到:
评论

相关推荐

    JS构造函数的执行过程

    通过new操作符调用的函数为构造函数,会构造出一个类的实例 一个函数直接调用则为普通函数调用方式,用new调用则为构造函数调用方式 function Fn(name,age){ let n = 5; this.name=name; this.age=age; } Fn(a,10...

    Malloc和new区别

    3 ,因此C++ 语言需要一个能完成动态内存分配和初始化工作的运算符new ,以一个能完成清理与释放内存工作的运算符delete.注意ne w/delete 不是库函数。 4 ,C++ 程序经常要调用C函数,而C 程序只能用malloc/free ...

    c++中new和delete操作符用法

    当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,第二步就会被省略。 new用法: 1. 开辟单变量地址空间...

    JavaScript构造函数详解

    new 操作符会自动创建给定的类型并返回他们,当调用构造函数时,new会自动创建this对象,且类型就是构造函数类型。 3.也可以在构造函数中显示调用return.如果返回的值是一个对象,它会代替新创建的对象实例返回。...

    JS使用new操作符创建对象的方法分析

    在编写js代码时,我们有时会需要使用函数来模拟java中的类,并用它来产生对象,在定义了一个构造函数之后我们需要使用new操作符来调用调用函数才能得到我们想要的对象。例如: [removed] function Constructor(name...

    C++中的三大函数和操作符重载(Boolan)

    如果对象是通过new操作符创建的,则通过delete操作符调用析构函数。 复制构造函数: 形如foo_t(const foo_t& foo),以下情况复制构造函数均会被调用: 当对象按值返回时候(returned by value) 调用按值传参的函数...

    php构造函数实例讲解

    PHP官网定义:复制代码 代码如下:构造函数是类中的一个特殊函数,当使用 new 操作符创建一个类的实例时,构造函数将会自动调用。当函数与类同名时,这个函数将成为构造函数。如果一个类没有构造函数,则调用基类的...

    C++ 中继承与动态内存分配的详解

    派生类是否需要为显示定义析构函数,复制构造函数和赋值操作符呢? 不需要! 首先,来看是否需要析构函数,如果没有定义析构函数,编译器将定义一个不执行任何操作的默认构造函数。实际上,派生类的默认构造函数...

    C++new和delete详细解析

    C++中的new 和delete 是操作符,new 分配对象时候会自动调用构造函数,delete对象时候,会自动调用析构函数,而C语言中 malloc() 和 free() 是函数。 理论上malloc free 和 new 、delete 可以混搭用,但是好不要...

    详解Javascript中new()到底做了些什么?

    以这种方式调用构造函数实际上会经历以下 4个步骤: (1) 创建一个新对象; (2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ; (3) 执行构造函数中的代码(为这个新对象添加属性) ; (4) ...

    Javascript 构造函数详解

    在Javascript中构造函数首先是一个普通的函数,它可以使用new 操作符来调用,并生成一个特殊类型的对象。 代码如下: // “Benjamin” is a constructor var benjamin = new Benjamin(“zuojj”, “male”); 在上面...

    后端,面试,c++ ,找工作

    (3)new可以调用对象的构造函数,对应的delete调用相应的析构函数。 (4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数 (5)new、delete返回的是某种数据类型指针,malloc、free返回的是void...

    C++之继承和动态内存分配

     这将不需要在派生类中显式的定义析构函数,复制构造函数,赋值操作符。如果在派生类中没有定义析构函数,编译器将定义一个不执行任何操作的默认构造函数,实际上,派生类的默认构造函数总要进行一些操作:执行...

    全面解析C++中的new,operator new与placement new

    operator new(1)只分配所要求的空间,不调用相关对象的构造函数。当无法满足所要求分配的空间时,则 -&gt;如果有new_handler,则调用new_handler,否则 -&gt;如果没要求不抛出异常(以nothrow参数表达),则执行bad_...

    深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理资源。 malloc/free需要手动计算类型大小且返回值类型为void*;new/delete可自动计算类型的大小,返回对应类型的指针。 malloc/free管理内存...

    详解Java中的clone方法?原型模式

    Java中对象的创建  clone顾名思义是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。...分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后

    C++ Primer第四版【中文高清扫描版】.pdf

    14.8 调用操作符和函数对象 449 14.8.1 将函数对象用于标准库算法 450 14.8.2 标准库定义的函数对象 451 14.8.3 函数对象的函数适配器 453 14.9 转换与类类型 454 14.9.1 转换为什么有用 454 14.9.2 转换操作符 455 ...

    新手学习C++入门资料

    C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。 标准C++中的字符串类取代了C标准C函数库头文件中的字符数组处理函数。 C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。...

    C#方法的总结详解

    先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针和同步索引),最后调用构造函数来设置对象的初始状态。构造函数不能被继承,所以不能被virtual、new、override、sealed和abstract修饰,若没有...

    JS创建对象几种不同方法详解

    要创建person的实例,必须使用new操作符,以这种方式调用构造函数实际上会经历4个步骤: 1、创建一个新对象 2、将构造函数的作用域赋给新对象 3、执行构造函数中的代码 4、返回新对象 创建自定义的构造函数可以...

Global site tag (gtag.js) - Google Analytics