new的用法
来源:互联网 发布:nginx 1.8.0 域名 ip 编辑:程序博客网 时间:2024/06/03 22:51
楼主
在c++中如何用new生成一个构造函数带参数的类数组?比如
#include<iostream.h>
class member
{
public:
member(int id)
{
cout<<id<<endl;
}
};
void main()
{
int *a;
a=new int[100];
for(int i=0;i<100;i++)
a[i]=i;
//想要用new动态定义一个member数组[100]
//并用a中的元素作为参数对应初始化member数组
//如member a[90](a[90]);
}
//主要是语法不会,希望大侠帮帮忙
作者:bruceteen 发表时间:2007-12-18 15:32:00
第1楼
#include <iostream>
#include <new>
using namespace std;
class foo
{
public:
explicit foo( int id=0 ) : id_(id)
{
cout << __FUNCTION__ << " " << id_ << endl;
}
~foo()
{
cout << __FUNCTION__ << " " << id_ << endl;
}
private:
int id_;
};
int main()
{
int a[2] = { 0, 1 };
// 第一种方法
{
foo b[2] = { foo(a[0]), foo(a[1]) };
}
cout << "-----------------" << endl;
// 第二种方法
{
char _b_buf_[ sizeof(foo)*2 ];
foo (&b)[2] = (foo(&)[2])_b_buf_;
for( size_t i=0; i<2; ++i )
{
new(&b[i]) foo( a[i] );
}
// ...use b
for( size_t i=0; i<2; ++i )
{
b[2-1-i].~foo();
}
}
cout << "-----------------" << endl;
// 这估计就是你要的了,和第二种方法一样
{
foo* p = (foo*)operator new( sizeof(foo)*2 );
for( size_t i=0; i<2; ++i )
{
new(&p[i]) foo( (int)i );
}
// ...use b
for( size_t i=0; i<2; ++i )
{
p[2-1-i].~foo();
}
operator delete( p );
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
用法的正确方法应该如何操作
- C++ new用法的正确方法应该如何操作?
- 在这篇文章中我们将会根据其两种不同的含义分别介绍一下它的影音方法,希望能给大家带来一些帮助。
C++编程语言中有一种叫做new的术语。不过这一概念是比较模糊的,有些人把它理解为new函数,但是有的人又会把它理解为new运算符。那么它的真正含义又是如何的呢?在这里我们将会通过对C++ new用法的介绍,帮助大家一起分析一下。
C++ new用法之一 new运算符
最常用的是作为运算符的new,比如:
string *str = new string(“test new”);
作为运算符,new和sizeof一样,是C++内置的,你不能对它做任何的改变,除了使用它。
new会在堆上分配一块内存,并会自动调用类的构造函数。
C++ new用法之二 new函数
第二种就是new函数,其实new运算符内部分配内存使用的就是new函数,原型是:
void *operator new(size_t size);
new函数返回的是一个void指针,一块未经初始化的内存。如你所见,这和C语言的malloc行为相似,你可以重载new函数,并且增加额外的参数,但是必须保证第一个参数必须是size_t类型,它指明了分配内存块的大小,C++允许你这么做,当然一般情况下这是不必要的。如果重载了new函数,在使用new操作符时调用的就是你重载后的new函数了。
如果使用new函数,和语句string *str = new string(“test new”)相对的代码大概是如下的样子:
- string *str = (string*)operator new(sizeof(string));
- str.string(“test new”);
- // 当然这个调用时非法的,但是编译器是没有这个限制的
这还不算完,还有第三种的new存在。
C++ new用法之三 placement new
第三种,placement new,这也是new作为函数的一种用法,它允许你在一块已存在的内存上分配一个对象,而内存上的数据不会被覆盖或者被你主动改写,placement new同样由new操作符调用,调用格式是:
new (buffer) type(size_t size);
先看看下面的代码:
- char str[22];
- int data = 123;
- int *pa = new (&data) int;
- int *pb = new (str) int(9);
结果*pa = 123(未覆盖原数据),而*pb = 9(覆盖原数据),可以看到placement new 并没有分配新的内存,也可以使用在栈上分配的内存,而不限于堆。
为了使用placement new 你必须包含<new>或者<new.h>
其实placement new和第二种一样,只不过多了参数,是函数new的重载,语法格式为:
void *operator new(size_t, void* buffer);
它看起来可能是这个样子:
void *operator new(size_t, void* buffer) { return buffer;}
和new对应的就是delete了,需要回收内存啊,不然就泄漏了,这个下次再写吧,回忆一下今天的内容先。
总结
1. 函数new
void *operator new(size_t size); 在堆上分配一块内存,和placement new(void *operator new(size_t, void* buffer)); 在一块已经存在的内存上创建对象,如果你已经有一块内存,placement new会非常有用,事实上,它STL中有着广泛的使用。
2. 运算符new
最常用的new,没什么可说的。
3. 函数new不会自动调用类的构造函数,因为它对分配的内存类型一无所知;而运算符new会自动调用类的构造函数。
4. 函数new允许重载,而运算符new不能被重载。
5. 紧接着就是对应的delete。
以上就是对C++ new用法的详细介绍。
参考文献:http://blog.csdn.net/stormkey/article/details/5796343
- C++new的用法
- placement new的用法
- C++ new的用法
- new的一些用法。
- C++ new的用法
- new/delete 的用法
- placement new的用法
- placement new的用法
- C++new的用法
- new 的新用法
- new 的用法
- placement new的用法
- C++new的用法
- C++ new的用法
- c++ new的用法
- new的另类用法
- c++ new的用法
- new的用法
- ScrollView白边问题
- 关于zend studio 出现乱码问题的总结--转载自脚本之家
- 【Android】AlertDialog及其子类
- Codeforces Round #227 (Div. 2)---A. George and Sleep
- APUE(UNIX环境高级编程)程序架构编译分析(Makefile)
- new的用法
- 购车指南首次买车必看系列之(二): 产权篇
- 【C#】——C#初识
- excel函数处理多个单元格内容相连生成新单元格内容
- 【安装】freetype2
- 移动终端项目设置属性
- 划线算法
- angular js 标签使用
- thinkphp3.2定义多模块并设置默认模块