2013-05-18 120 views
0

我想實現一個容器將內存分配給堆,但它好像我的基構造函數和我的參數構造函數不喜歡彼此。下面,我發佈了沒有任何註釋的代碼。就目前而言,它崩潰了。在複製構造函數和賦值運算符中刪除私有數組

#include <iostream> 
using namespace std; 

class foo 
{ 
public: 
    foo() {size=1; vals = new double[1]; vals[0]=0;} 
    ~foo() {delete[] vals;} 

    foo(const foo& other) 
    { 
     size=other.getsize(); 
     delete[] vals; 
     vals = new double[size]; 
     for(long unsigned i=0; i<size; i++) 
      vals[i]=other[i]; 
    } 

    foo& operator=(const foo& other) 
    { 
     size=other.getsize(); 
     delete[] vals; 
     vals = new double[size]; 
     for(long unsigned i=0; i<size; i++) 
      vals[i]=other[i]; 
     return *this; 
    } 

    foo(double* invals, long unsigned insize) 
    { 
     size=insize; 
     delete[] vals; 
     vals = new double[size]; 
     for(long unsigned i=0; i<size; i++) 
      vals[i]=invals[i]; 
    } 

    double operator[](long unsigned i) const {return vals[i];} 

    long unsigned getsize() const {return size;} 
private: 
    double* vals; 
    long unsigned size; 
}; 


int main() 
{ 
    double bar[3] = {5,2,8}; 
    foo B(bar, 3); 

    cout<< B[0]<< " "<< B[1]<< " "<< B[2]<<endl; //couts fine 

    foo A; //crashes here 

    return 0; 
} 

但是,當我改變主要是:

int main() 
{ 
    double bar[3] = {5,2,8}; 
    foo B(bar, 3); 

    cout<< B[0]<< " "<< B[1]<< " "<< B[2]<<endl; //couts fine 

    foo A(); //works now 

    return 0; 
} 

運行良好。但是,我不能指定A = B,因爲它認爲foo是一個函數或其他東西。

+0

如果你想在當時沒有任何東西的時候使用'delete',你必須根據你的需要重載刪除操作符,因爲當那個對象被調用的時候,這個對象中什麼也沒有,這可能是問題爲你的崩潰.. – goodies

回答

2

我假設你有一些非常令人信服的理由不使用std::vector<double>這裏...

但無論如何...在你的拷貝構造函數,你不想delete[] vals

foo(const foo& other) 
{ 
    size=other.getsize(); 
    vals = new double[size]; 
    for(long unsigned i=0; i<size; i++) 
     vals[i]=other[i]; 
} 

當拷貝構造函數被調用時,你的對象尚未初始化,所以vals*甚至不指向任何有效的。因此,刪除它將調用undefined behavior(並且程序崩潰)。您只需在您的賦值運算符中輸入delete[] vals

此外,當您聲明Foo變量A時,您不希望變量名後的圓括號。只是說:

foo A; 

當您將這些括號的變量名後,你實際上寫的用在C繼承語法函數聲明,並A成爲一個函數指針類型。

相關問題