2011-04-21 5 views
0

별을 사용하여 문제를 일으키는 2 개의 행에 서명했습니다.리눅스에서 메모리를 할당하는 데 문제가 있습니다.

첫 번째 행은 두 번째 서명 된 행에 사용될 로그 파일 용 메모리를 할당합니다. 두 번째로 서명 된 행에 세그멘테이션 오류가 발생합니다. "logfile"이 할당되지 않았기 때문에 발생합니다. load()에서 메모리를 할당하면 제대로 작동하기 때문에 확신 할 수 있습니다. 그러나 load() 메서드가 아니라 클래스의 생성자에서 메모리를 할당하려고합니다.

왜 작동하지 않는지 나는 이해할 수 없다! 이것은 리눅스에서 처음이므로 어쩌면 내가 잘못하고있는 것입니다!

내가 서버 클래스의 소멸자가 표시되지 않습니다, 마르코

server::server(){ 
    port = 0; 
    serverup = 0; 
    loaded = 0; 
    logfile = (char *) malloc(SERVER_PATHS_SIZE*sizeof(char)); //**************************** 
} 

int server::load(int in_id, char *in_name, char *in_ip, int in_port, 
       char *in_rcon, char *in_logfile){ 

    int err; 

    sprintf(name, "%s\x00", in_name); 
    sprintf(ip, "%s\x00", in_ip); 
    port = in_port; 
    sprintf(rcon, "%s\x00", in_rcon); 
    sprintf(logfile,"%s\x00", in_logfile); //********************************** 

    err = urt.set(ip, port, rcon); 
    if(err < 1){ 
     printf("server::load(): error from urt.set()\n"); 
     return 0; 
    } 

    printf("server::load(): server %d loaded!\n", id); 
    loaded = 1; 

    return 1; 
} 
+2

코드를 문제를 보여주는 작동 가능한 (실행 가능하고 실행 가능한) 예제로 줄이십시오. 그렇지 않으면 문제가 어디인지 추측 할 수 있습니다 ... – sleske

+0

'logfile'이 선언 된 곳을 볼 수 없습니다. 클래스 서버의 멤버 변수입니까? 그것은 세계적인가? 예제를 독립 실행 형으로 만드는 것은 디버깅에 중요합니다. – DevSolar

+0

C++을 프로그래밍 할 때'malloc'보다'new'가 일반적으로 더 좋습니다 – knittl

답변

0
  1. 을 주셔서 감사합니다. 기억을 해방하는 소멸자가 있습니까?

  2. 서버 개체를 만들고 사용하는 코드가 표시되지 않습니다. 서버 객체를 생성 한 다음 사본을 만들 수 있으며 복사 의미를 올바르게 구현하지 않아서 문제가 발생합니까?

+0

(2) 아니요, (1) 때문에 불가능합니다. :) –

+0

다크 팔콘, 당신은 천재입니다! 그게 문제 였어 !! 많은 감사합니다! – Marco

+0

기본적으로 생성자는 호출되지 않았습니다 ... 아마도 나는 잘못된 방법으로 서버 객체를 생성하고있었습니다! 답장을 보내 주셔서 감사합니다. – Marco

4

난 당신이 printf와 은 처음에 %의 인수에 null로 끝나는 문자열을 필요로하기 때문에이 printf와 함께 작동하지 않습니다 in_logfilein_rcon

nullterminate하려고 생각합니다.

charptr[known_length] = 0 

대신

+1

약간의 보완을 위해, 'sprintf'에 대한 원래의 입력에 널 종결이 없기 때문에 원본 입력의 끝을 지나서 데이터 방향이 읽혀 잘못된 읽기가 발생하기 때문에 세그먼테이션 오류가 발생합니다.또한, 출력 배열에 생각보다 많은 데이터를 더 많이 할당하려고 시도하면 잘못된 쓰기가 발생합니다. –

1

이것은 확실히 대답이 아니라 C++에서 핵 물질은 당신이 당신의 C-와-클래스 코드를 얻을 메모리 문제를 해결하는 데 도움이 될 것입니다.

std :: strings를 사용하면 sprintf와 비교하여 복사하는 것이 쉽고 훨씬 안전합니다. deprecated char *를 사용하면 혼란스러워집니다.

좋은 부작용은 메모리를 수동으로 할당 (malloc 또는 new) 할 필요가 없으며 메모리 누수의 위험을 제거 할 수 있다는 것입니다.

+0

'char *'를 사용하여 문자 배열을 처리하는 것이 더 이상 사용되지 않습니다. (비록 char const *가 아닌'char *'에 대한 문자열 리터럴의 바인딩이다.) –

관련 문제