2011-01-25 11 views
1

일부 메모리를 malloc과 함께 할당합니다. 약 128 바이트입니다.Realloc이 null을 반환합니까?

나중에 약 200 바이트의 realloc을 호출하지만 null을 반환합니다!

내가 사용 가능하다면 유효한 포인터를 반환하고 다른 하나는 malloc이지만 realloc을 사용하고 싶습니다.

이 동작을 설명 할 수있는 것은 무엇입니까 (메모리가 부족하지는 않은 것 같습니다). 이것은 유효한 행동입니까?

코드 비트 :

//class constructor 
size = 0; 

sizeAllocated = DEFAULT_BUFFER_SIZE; //64 

data = (char*)malloc(sizeAllocated * sizeof(char)); //data is valid ptr now, I've checked it 

data[0] = '\0'; 

//later on: 
//append function 
bool append(char** data, const char* str, size_t strLen) { 
    if((size + strLen) >= sizeAllocated) { 
    sizeAllocated += strLen + 1 + BUFFER_ALLOCATION_STEP; 
    char* temp = realloc(*data, sizeAllocated * sizeof(char)); 
    if(temp) 
     *data = temp; 

    return(temp != NULL); 

}

EDIT : 고정. 내 클래스에 < < 연산자를 오버로딩했고 void가 아닌 this를 반환했습니다. 어떻게 든 이것은 모든 것을 고생하고 있었다! 왜 이런 일이 일어 났는지 설명 할 수 있다면 좋을 것입니다!

+4

많이 할당/할당 해제 하시겠습니까? 그것은 힙 조각화를 일으키고 인접한 메모리를 제한 할 수 있습니다. 그것은 200b 무료로 찾을 수 없을 것 같지는 않지만. –

+0

나는 꽤 적은 양을 할당합니다. 그리고 이것은 main() {} 내부에 첫 번째로 배치 된 경우에도 실패합니다. – Pubby

+0

valgrind에 대한 직업처럼 보입니다. – bmargulies

답변

1

내가 정확히 같은 값, 그것은 reallocs

을 이제 우리가 파악할 수있는 상수 sizeAllocated를 교체 할 경우 다음과 같은 코멘트는 질문

data = (char*)realloc(data, (size_t)(sizeAllocated * sizeof(char))); 

에 추가 된 이후 무슨 일이 있었는지. sizeAllocated를 같은 값을 가지고 있지 않은 상수로 바꿨습니다. 디버깅을 위해 sizeAllocated 값을 출력하는 문을 추가하면 놀라게됩니다.

+6

그리고 FFS는'sizeof (char)'에 의해 곱셈을 멈 춥니 다. 그것은 좋은 전자의 낭비입니다 :-) - 이것이 원래 OP의 코드이기 때문에 이것은 WinProg보다는 OP에 관한 것입니다. – paxdiablo

+0

작동하지 않았습니다. realloc 직전에 콘솔에 값을 출력하여 상수를 얻었습니다. 상수가 어쨌든 그것을 실제로 고쳤다면 확실하지 않습니다. 때때로 작동하고 다른 경우에는 작동하지 않는 것 같습니다! – Pubby

+0

@ paxdiablo - 나는 당신을 충분히 열심히 일할 수 없습니다. C에서 반사 된 "no casting void pointer"를 제지해야했습니다. –

관련 문제