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; 
} 

. 그러나 foo가 함수라고 생각하기 때문에 A = B를 대입 할 수 없습니다.

+0

그때 아무것도 보이지 않으면 '삭제'를 사용하고 싶다면 필요에 따라 삭제 연산자를 오버로드해야합니다. 그 시간에 해당 생성자가 호출 될 때 아무 것도 없기 때문에 문제가 될 수 있습니다. 너의 충돌에 .. – 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 만 필요합니다.

변수 A을 선언 할 때 변수 이름 다음에 괄호가 필요하지 않습니다. 당신이 변수 이름 뒤에 그 괄호를 배치 할 때 당신은 실제로 C에서 상속 구문을 사용하여 함수 선언을 작성하고,

foo A; 

A는 함수 포인터 타입이된다 : 그냥 말한다.