2017-04-13 57 views
1

在我的理解中,在通常情況下,數組在編譯時被分配內存,但是當數組是一個成員變量時會發生什麼,在編譯過程中幾乎沒有任何東西可以分配內存。是否在創建該類的實例時被隱式動態分配?如何將內存分配給具有數組成員的類的實例?

class Arr{ 
    public: 
    int arr[10]; 
}; 

Arr doSomething(Arr &arg){ 
    return arg; //copy of arg created; 'copy=new int[10]' at this point? 
} 

int main(){ 
    Arr temp; 
    doSomething(temp); 

    //if returned object's array was dynamically initialized 
    //will it result the array in temp being released twice? 
} 

UPD。在我的情況下,當我嘗試將B> A的A-B分解時,情況會上升。在這些情況下,我可以訪問數組來讀取它,但修改它的值會導致垃圾。此外,在main的最終輸出是好的。下面是完整的代碼:

#include <iostream> 

using namespace std; 

const int MAX_ARRAY_SIZE=256; 

char* getOperatorIndex(char* equationString); 
bool isOperator(char characterDec); 
int* toIntArray(char* firstInA, char* lastInA, int* firstInB); 

class Number{ 
    int* firstInNumber; 
    int* lastInNumber; 
    int number[MAX_ARRAY_SIZE]; 

    public: 
    Number(); 
    ~Number(); 
    bool operator<(Number& b); 
    int& operator[](int index); 
    Number operator-(Number& b); 
    void print(); 
    int length(){return lastInNumber-firstInNumber;} 
    int*& lastPtr(){return lastInNumber;} 
    int*& firstPtr(){return firstInNumber;} 
}; 

Number::Number(){ 
    firstInNumber=number; 
    lastInNumber=number; 
} 

Number::~Number(){ 
    cout<<"number destroyed"<<endl; 
} 

int& Number::operator[](int index){ 
    return number[index]; 
} 

bool Number::operator<(Number& b){ 
    if(length()>b.length())return false; 
    if(length()<b.length())return true; 

    for(int a=0;a<length();++a){ 
     if(number[a]>b[a])return false; 
     if(number[a]<b[a])return true; 
    } 
    return false; 

} 

void Number::print(){ 
    for(int a=0; a<=length(); ++a){ 
     cout<<number[a]; 
    } 
    cout<<endl; 
} 

Number Number::operator-(Number& b){ 

    Number result; 

    if(*this < b) 
    { 
     result=b-*this; 
     cout<<*result.lastPtr()<<endl; 
     result.print(); 
     *result.lastPtr()*=-1; // GARBAGE HERE 
     cout<<*result.lastPtr()<<endl; 
     return result; 
    } 

    result[0]=0; 

    for(int q=0; q<=length(); ++q) 
    { 

     if(b.length()-q >= 0) 
     { 
      result[q]+=(*this)[length()-q]-b[b.length()-q]; 

      if(result[q] < 0) 
      { 
       result[q]+=10; 
       result[q+1]=-1; 

      } 
      else 
      { 
       result[q+1]=0; 
      } 

     } 
     else 
     { 
      result[q]+=(*this)[length()-q]; 

     } 

    ++result.lastPtr(); 
    } 

    do{ 
     --result.lastPtr(); 
    }while(!*result.lastPtr()); 

    return result; 
} 

int main(){ 
    char equationArray[MAX_ARRAY_SIZE*2+1]; // operandA(<=256) operator(1) operandB(<=256) 
    Number a,b; 

    cin>>equationArray; 
    char* operatorPtr=getOperatorIndex(equationArray); 

    a.lastPtr()=toIntArray(equationArray, operatorPtr, a.firstPtr()); 
    b.lastPtr()=toIntArray(operatorPtr+1, operatorPtr+strlen(operatorPtr), b.firstPtr()); 

    a.print(); 
    b.print(); 

    Number c; 
    switch(*operatorPtr){ 
     case '-': 
      c=a-b; 
      break; 
    } 
    c.print(); 

} 


char* getOperatorIndex(char* equationString){ 
    while(!isOperator(*++equationString)); 
    return equationString; 
} 

bool isOperator(char characterDec){ 
    if(characterDec>='*' & characterDec<='/')return true; 
    return false; 
} 


int* toIntArray(char* firstInA, char* lastInA, int* firstInB){ 
    while(lastInA-firstInA>0){ 
     *firstInB=*firstInA-'0'; 
     ++firstInB; 
     ++firstInA; 
    } 
    return --firstInB; 
} 
+0

您是否嘗試過運行此程序?說實話,我也不確定如果你複製構建一個具有動態分配數組的東西會發生什麼。 –

+0

你能澄清你在問什麼 - 你爲什麼想象一個數組成員變量會不同於一個非數組成員變量? –

+0

我們可以看到你的類定義是一個typedef(如果它沒有靜態成員變量),並且類型不分配內存。 – olivecoder

回答

3

一類的所有數據成員具有相同存儲時間作爲創建類的對象。因此,在:

int main(){ 
    Arr temp; 
    doSomething(temp); 
} 

它的類型的數據成員temp.arrint[10];還具有自動存儲持續時間 ..(或什麼是不適當稱爲 「堆棧對象」)


Arr doSomething(Arr &arg){ 
    return arg; //copy of arg created; 'copy=new int[10]' at this point? 
} 

不,這裏沒有堆分配。而不是隱式拷貝構造函數的成員智能副本。請參閱How are C++ array members handled in copy control functions?

+0

如果有一個指針作爲成員變量,那會指向數組中的最後一個元素呢?當臨時對象被釋放時,它會導致數組中的指針變量被釋放嗎? –

+0

@MikeMike,如果有指針,那麼我們可以假設這個類的對象管理一個資源。在這種情況下,你應該**確定並實現你的特殊成員函數。這是因爲,隱式拷貝構造函數只會複製指針的值,指針仍然會指向** old **對象數組的最後一個元素。現在的問題是新複製的指針數據成員不是指向它自己的對象的數組的末尾,而是另一個對象。 – WhiZTiM

+0

@Mike Mike - 編號當包含指針的臨時對象被釋放或以其他方式銷燬時,指針默認不受影響。可以爲對象的類編寫一個析構函數,該函數明確地用指針做某事,但這需要程序員有意識地採取行動。 C++不是垃圾收集。 – Peter

相關問題