다음과 같은 방법으로 클래스의 객체를 만드는 방법의 차이점은 무엇입니까? 헤드 파일은 다음과 같습니다클래스의 객체를 만드는 방법
class NumberRange {
public:
NumberRange(int a, int b);
virtual ~NumberRange();
void Print(int a, int b);
private:
int *range_;
int size;
};
.CC 파일은 다음과 같습니다
#include <iostream>
#include "numberrange.h"
using namespace std;
NumberRange::NumberRange(int a, int b) {
if (a > b) {
cout << "a must be equal or less than b" << endl;
}
}
NumberRange::~NumberRange() {
}
void NumberRange::Print(int a, int b) {
this->size = b - a + 1;
this->range_[0] = a;
for (int i = 0; i < this->size; i++) {
this->range_[i] = a + i;
cout << this->range_[i] << endl;
}
}
int main() {
NumberRange * numberrange = new NumberRange(5, 9);
numberrange->Print(5, 9);
}
내가 포인터를 사용하여 객체를 생성하고 프로그램을 컴파일합니다. 나는 오류가 [1] 20346 segmentation fault ./numberrange
말한다 있어요하지만 같은 주요 기능을 변경하는 경우 :
int main() {
NumberRange numberrange(5,9);
numberrange.Print(5,9);
}
이 일 것입니다. 그래서 언제 포인터를 사용하여 객체를 만들어야하는지 모릅니다. 고맙습니다!
개체의 필드 중 하나는'int * range_'입니다. 생성자에서 초기화/할당하지 않으므로 Print 함수에서이 속성을 사용하면 정의되지 않은 동작이 발생합니다. 때로는 효과가 있으며 때로는 그렇지 않을 수도 있습니다. 먼저 수정 한 다음 다시 시도하십시오. –
당신은'range_'를 할당하지 않았습니다. 간단합니다. 따라서 정의되지 않은 동작을 호출하고 있습니다. 정의되지 않은 동작은 ... 음 ... 정의되지 않았습니다. –
두 번째 작품은 운이 좋았 기 때문입니다. 'range_' 객체를 저장하지 않고 접근합니다. 이것은 정의되지 않은 동작입니다. – Chad