2014-09-28 129 views
0

当我在堆上声明数组时,哪种方法更好?为了简单和例子的缘故,私人数据在这里公开。在堆上声明数组

我应该创建一个新的指针,修改数据,然后

CAT *Family = new CAT[2]; 

for(int i=0; i<2;i++){ 
    Family[i].age = i+1; 
} 

VS

CAT *Family = new CAT[2]; 
CAT *pCat; 


for(int i=0; i<2;i++){ 
    pCat = new CAT; 
    pCat->age = i+1; 
    Family[i] = *pCat; 
    delete pCat; 
} 
+1

第二种方法似乎在第一种方法上没有优势,而且更复杂。 – Beta 2014-09-28 04:24:01

+0

你有什么理由相信第二种方法有什么优势吗? – 2014-09-28 04:35:10

+0

@RSahu不,我使用第一种方法。但我在一个例子中看到了第二个。只是好奇。 – 2014-09-28 04:36:19

回答

0

你的第二个执行会分配在堆栈上更多的变量,将需要更多的复杂的汇编代码(我记得不得不为C风格语言的上述代码生成汇编代码,并且它变得很难受!)。对于奖励积分,如果你正在寻找优化,我建议你使用pre-increment in your for loop;)

2

这通常不是一个好主意,直​​接使用原始指针和new

越少越好。

相反,以创建在堆上阵列,这样做:

std::vector<Cat> cats(2); 
for(int i = 0; i < int(cats.size()); ++i){ 
    cats[i].age = i+1; 
} 

或可替代地,这样的:

std::vector<Cat> cats; 
for(int i = 0; i < 2; ++i){ 
    cats.emplace_back(i+1); 
} 

直接使用原始阵列和new的表示一个C程序员或无能,因为std::vector正是为了这个目的而在C++标准库中,所以要注意正确的内存管理。


还要注意,ALL UPPERCASE名称是用于宏的惯例。这个想法是为了尽量减少名称冲突和无意文本替换的机会。当您将这些名称用于其他事情时,您反而会增加名称冲突和无意文本替换的机会,更不用说许多程序员将大写字母看作是大声喊话或强调重点。

1

第一种方法在调用构造函数的次数方面具有确定的优势。对于你的微不足道的例子来说,它很好。但是,假设一个类在c'tor中进行了大量资源分配并将其释放。 第二种方法将这些c'tors和d'tor额外2次这是一个重罚。 #include using namespace std;

class CAT{ 
public: 
CAT(){ cout<<"c'tor called"<<endl;} 
int age; 
~CAT(){ cout<<"d'tor called"<<endl;} 
}; 

main(){ 
    CAT *Family= new CAT[2]; 
    CAT *pCat; 

    for(int i=0; i<2;i++){ 
    pCat = new CAT; 
    pCat->age = i+1; 
    Family[i] = *pCat; 
    delete pCat; 
    } 
} 

Run it 

$./a.out 
c'tor called 
c'tor called 
c'tor called 
d'tor called 
c'tor called 
d'tor called 
0

如果您尝试创建对象数组,则看不到第一个方法的优点。但是,如果您尝试创建指向数组的指针数组,则可能需要使用第二种方法,这可能指向不同的具体类型。

struct A 
{ 
    virtual ~A() {} 
}; 

struct B : A 
{ 
    int data; 
} 

struct C : A 
{ 
    double data; 
} 


int main() 
{ 
    A* array[20]; 

    // Get half of the array filled with B*. 
    for (int i = 0; i < 10; ++i) 
    { 
     B* b = new B; 
     b.data = i*10; 
     array[i] = b; 
    } 

    // Get the other half of the array filled with C*. 
    for (int i = 10; i < 20; ++i) 
    { 
     C* c = new C; 
     c.data = i*1.5; 
     array[i] = c; 
    } 

    // Delete the objects. 
    for (int i = 0; i < 20; ++i) 
    { 
     delete array[i]; 
    } 

    return 0; 
}