2011-02-09 9 views
0

다음 코드가 유효합니까? 값이 생성자에서 그 공간에 할당되기 전에 즉클래스의 포인터 초기화

class Foo() 
{ 
    int* Bar; 

    public: 

    Foo() 
    { 
     *Bar = 123; 
    } 
} 

Bar 실제로 실제 메모리 공간을 가리 킵니다? 또는 다음과 같은 작업을 수행해야합니까?

class Foo() 
{ 
    int* Bar; 

    public: 

    Foo() 
    { 
     Bar = new int[1]; 
     *Bar = 123; 
    } 

    ~Foo() 
    { 
     delete[] Bar; 
    } 
} 
+0

메모리 주소를 직접 지정하려고합니까? 어쨌든 나는 전문가는 아니지만 '새로운 int'또는 다른 어떤 원시적 인 것을 결코 말하지 않는다는 것을 확신합니다. – jakev

+0

Fitst one이 잘못되었습니다. 당신은 그것을 새롭게해야합니다. –

답변

2

두 번째 예의 경우와 마찬가지로 메모리를 할당해야합니다. 첫 번째 예제에서 코드를 실행하려고하면 초기화되지 않은 Bar 포인터의 값이 가리키는 메모리의 어떤 부분에 정수 123을 쓰려고하기 때문에 액세스 위반 오류로 인해 충돌이 발생할 가능성이 큽니다. 다음 동적 배열을 원하지 않는 경우

+0

예로서 제공됩니다. – Maxpm

+0

좋아요, 반영하기 위해 내 대답을 편집했습니다. – Coincoin

2

,

Bar = new int; 
*Bar = 123; 

은 충분하다! 그리고 당신이이 일을했습니다 :

delete Bar; //not delete[] Bar; 

-

당신이 동적 배열 (여러 값을 저장할 수있는 사용)을 원하는 그러나 경우, 다음을 수행하십시오

Bar = new int[5]; 
Bar[0] = 123; 
Bar[3] = 788; 
//etc 

다음 delete[] Bar은 할당 된 메모리를 삭제하는 올바른 방법입니다!

1

바는 값이 생성자의 해당 공간에 할당되기 전에 실제로 실제 메모리 공간을 가리 킵니까?

아니요. 포인터는 단지 "단순한"변수 일뿐입니다. 메모리를 할당하지 않습니다. 또한 초기화하지 않으면 메모리에서 임의로 예측할 수없는 위치를 가리 킵니다.

일반적으로 NULL (또는 선호도에 따라 0)으로 초기화하거나 할당 된 메모리 (예 : Bar = new int과 같이)로 초기화해야합니다. 첫 번째 예

1

- 객체에

int* Bar; 

포인터 포인트. 컴파일러의 일은 정수 변수의 주소를 보유하기 위해 정수 포인터 Bar에 메모리 (즉, 4 바이트)를 할당하는 것이다. 그러나 가리키는 위치는 참조 해제하기 위해 지정해야합니다.

더 이상 은행 계좌를 제공합니다. 은행 구좌를 가지고 있다고해서 ATM에서 돈을 인출 할 수있는 것은 아닙니다. 귀하의 계좌에는 돈을 가지고 있어야합니다. 돈이 없으면 트랜잭션이 실패하고 프로그래밍 패러다임에서 동작은 정의되지 않습니다. 따라서 첫 번째 예제 동작은 정의되지 않습니다. 내 비유가 너무 어색하면 미안하다.

두 번째 예에서

- 여기

int* Bar = new int[1] ; // Here [1] is unnecessary as your Bar points to a single integer memory location. 

, Bar은 유효한 정수의 위치에 대한 포인터를 가리키는은 무료 가게에서 가져온 것입니다. 따라서 가리키는 위치 인 Bar에 가비지 값이있을 수 있습니다. 그래서, 역 참조하기 전에 그것을 초기화하십시오. 즉,

두 번째 예에서는 자원을 관리하므로 소스를 무료 저장소로 되돌려 보내야합니다.

관련 문제