首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么用new运算符在堆区开辟一个对象数组的空间呢

2012-05-10 
如何用new运算符在堆区开辟一个对象数组的空间呢,C/C++ code#includeiostreamusing namespace stdclass

如何用new运算符在堆区开辟一个对象数组的空间呢,

C/C++ code
#include<iostream>using namespace std;class A{public:    A(int a,int b):i(a),j(b){}    void print()    {        cout<<i<<" "<<j<<endl;     }private:    int i;    int j;};
有这样一个类,如何用new运算符在堆区开辟一个对象数组的空间呢,

[解决办法]
C/C++ code
A *pArr = new A[NUM];
[解决办法]
必须给 A 一个默认构造函数才行.
[解决办法]
无参数或者默认参数
[解决办法]
要直接使用数组必须要有无参的构造函数.

或者可以这样不直接创建数组:
C/C++ code
A* pA = (A*)malloc(sizeof(A) * COUNT);for(int i = 0; i < COUNT; ++i){    new (&pA[i]) A(10, 20);}
[解决办法]
比较诡异的用法(测试居然可以正常工作):
A *pAx=(A *)new BYTE[sizeof(A)*100];
......
delete [](BYTE*)pAx;
[解决办法]
首先回答你的第一个问题:
new出的对象默认都是存在堆中的,所以……尽管去new。(如果有引用则另说)

探讨

C/C++ code

A *pArr = new A[NUM];


这个就是在堆空间里的。

[解决办法]
探讨

比较诡异的用法(测试居然可以正常工作):
A *pAx=(A *)new BYTE[sizeof(A)*100];
......
delete [](BYTE*)pAx;

[解决办法]
C/C++ code
class A{public:    A(int a,int b):i(a),j(b){}    void print()    {        _tprintf_s(_T("[%d %d]"), i,j);     }    void Set(int a,int b){i=a; j=b;}private:    int i;    int j;};    A *pAx=(A *)new BYTE[sizeof(A)*100];    pAx->print();//没初始化,输出乱数字,但执行是正常的    pAx[5].Set(33,55);//执行正常    pAx[5].print();//这个执行与效果一切正常...    delete [](BYTE*)pAx;
[解决办法]
探讨

要直接使用数组必须要有无参的构造函数.

或者可以这样不直接创建数组:
C/C++ code

A* pA = (A*)malloc(sizeof(A) * COUNT);
for(int i = 0; i < COUNT; ++i)
{
new (&amp;pA[i]) A(10, 20);
}

[解决办法]
C/C++ code
class A{public:    A(int a,int b):i(a),j(b){}    void print()    {        _tprintf_s(_T("[%d %d]"), i,j);     }    void Set(int a,int b){i=a; j=b;}private:    int i;    int j;};int _tmain(int argc, _TCHAR* argv[]){    A *pAx=(A *)new BYTE[sizeof(A)*100];    pAx->print();    pAx[5].Set(33,55);    pAx[5].print();    delete [](BYTE*)pAx;return 0;} 

热点排行