C에서 변수 (예 : 긴 문자열)에 사용한 메모리를 어떻게 해제 할 수 있습니까?C에서 변수에 사용 된 메모리를 해제하는 방법은 무엇입니까?
답변
메모리를 malloc
또는 다른 메모리 할당자를 사용하여 동적으로 할당했다고 가정하면 free
을 사용하여 메모리를 해제합니다. 메모리가 정적으로 할당 되었으면 해제 할 수 없습니다.
저주! 다시 망 쳤어!표준 라이브러리 함수 중 일부는 malloc 또는 calloc을 호출하고 호출자에게 메모리를 해제해야한다는 점에 유의하십시오. – dmckee
@dmckee : 반환 할 블록을 free() 할 것을 요구하는 타사 또는 플랫폼 API가있을 수 있지만 (malloc, calloc 및 realloc과 같은 할당 라이브러리 이외의) 표준 라이브러리 함수는 인식하지 못합니다. 이 작업을 수행. –
정말 당신이 당신의 변수 선언 방법에 따라 달라집니다 - 그것은 일반 변수의 경우 "할당 해제는"이 메모리의 기운 - 그것은 여기처럼 범위에서 얻을 때 출시됩니다
for (int i=0;i<10;i++) {
int k=i;
//do stuff
}
나는 것 루프를 종료하면 할당이 취소되고 k는 루프 본문을 통과 할 때마다 할당되고 할당이 해제됩니다. 이 런타임 메모리 할당에 대해이되면
당신은
int* intArray;
malloc(200 * sizeof(int));
이 당신에게 (200) int 배열을 줄 것이다 믿음직한의 malloc 무료 :)를 사용할 수 있습니다.
당신은, 수 당신이 malloc을 사용하지 않는 가정하고, 문자열을 만들거나
char array[100];
를 사용하여 버퍼하지만 당신은 당신은 단지 긴 기능의 아주 짧은 부분을 사용하고 있는지 알고 함수의 일부분을 다른 {} 집합에 배치하십시오.
int reallylongfunction() {
// Do a lot of stuff
{
char stringbuffer[100];
// Do stuff with the buffer...
// Ok, we're done with the buffer, and don't want it anymore
}
// Do a lot more stuff
return;
}
이렇게하면 버퍼가 범위를 벗어나서 해제됩니다. 조심해라. 여분의 {} 안에 선언 한 다른 것은 범위를 벗어나 사라질 것이다!
편집 : 저주, 의견이 맞습니다. 범위를 벗어나는 정적 문자열은 아무런 효과가 없습니다. 수정되어 단지 배열에 불과합니다.
제안 된 코드는 "string"변수가 4 또는 8 바이트를 저장하는 범위를 벗어날 경우에만 발생합니다. C 표준 (6.4.5.5)에 따르면 문자열의 값은 정적 저장 기간의 배열이므로 효과적으로 영구적으로 할당됩니다. –
글쎄 실제로 거기에 문자열의 두 복사본을 가지고 있으며, 그들 중 하나만 함수를 반환 wheund 릴리스됩니다 (_maybe_ 일찍). 방금했다면 : static const char mystr [] = "..."; 괜찮은 컴파일러는 코드에 하나의 버전을 넣을 것입니다 (절대로 사라지지 않을 것입니다). –
ustr은 자동으로 일정하고 동적으로 할당 된 문자열과 함께 사용할 수있는 문자열 API입니다. 두 개 중 실제로 두 개 중 하나만 "자유롭게"할 수 있지만 모두 같은 방법으로 취급하고 ustr_free()에 전달할 수 있습니다.
스택, 힙 및 데이터 (RO 텍스트 문자열)가 "할당"및 "해제"되는 방법에 대해 배우고 싶지만 도움이되는 학습을하는 동안 사용 가능한 API를 사용하면 당신은 많이 (그리고 당신이 당신 스스로하는 것보다 훨씬 더 빠를 것입니다).
이 질문은 더 이상의 정보가 없으면 대답 할 수 없습니다. 객체를 해제하는 방법을 알 수있는 유일한 방법은 객체가 어떻게 할당되었는지를 아는 것입니다.
그리고 객체, 난 그냥 C++ '객체',하지만 '객체'는 C 표준에 사용되는하지 의미 말할 때 :
영역 실행 환경에서 데이터 저장을 내용 값을 나타낼 수 있습니다.
- 1. CFStringTokenizerCreate에서 생성 된 메모리를 해제하는 방법은 무엇입니까?
- 2. 행렬에 사용 된 메모리를 올바르게 해제하는 방법은 무엇입니까?
- 3. C에서 메모리를 할당하고 할당을 해제하는 가장 안전한 방법은 무엇입니까?
- 4. C에서 메모리를 해제하는 동안 오류가 발생했습니다
- 5. MPMoviePlayerController 미리로드 메모리를 해제하는 방법은
- 6. scedule selector가 차지하는 메모리를 해제하는 방법은 무엇입니까?
- 7. iPhone에서 메모리를 할당 해제하는 방법은 무엇입니까?
- 8. mmap을 사용하여 할당 된 메모리를 해제하는 방법은 무엇입니까?
- 9. 가상 메모리를 해제하는 방법?
- 10. 루프 된 객체에서 메모리를 해제하는 방법
- 11. CUDA에서 __device__ 메모리를 해제하는 방법
- 12. CGImageCreateWithImageInRect와 관련된 메모리를 해제하는 방법
- 13. C에서 부모 프로세스의 변수에 액세스하는 방법은 무엇입니까?
- 14. Objective-C에서 객체의 변수에 액세스하는 방법은 무엇입니까?
- 15. C에서 구조체의 메모리를 어떻게 관리합니까?
- 16. CGContextDrawPDFPage 작성한 메모리를 해제하는 방법
- 17. 가비지 컬렉터를 고려하여 사용 된 메모리를 테스트하는 방법은 무엇입니까?
- 18. C에서 sitemap gz 파일을 다운로드하여 압축 해제하는 방법은 무엇입니까?
- 19. C에서 할당 된 메모리를 할당하고 비우는 방법
- 20. Objective-C에서 NSMutableDictionary 인스턴스 변수를 중첩 된 사전으로 적절하게 해제하는 방법은 무엇입니까?
- 21. 버퍼를 올바르게 참조 해제하는 방법은 무엇입니까?
- 22. 차단 된 소켓의 차단을 해제하는 방법은 무엇입니까?
- 23. C에서 메모리를 확보하기위한 패턴?
- 24. C에서 메모리를 할당 할시기는?
- 25. Bash에서 총 물리적 메모리를 가져 와서 변수에 할당하는 방법은 무엇입니까?
- 26. java 프로그램 실행 후 메모리를 해제하는 방법
- 27. "Java 용 __________"은 "C에서 사용 가능"또는 "C++에서 삭제"
- 28. 메모리를 해제하는 동안 세그먼트 화 오류가 발생했습니다
- 29. Objective-C에서 category를 사용하여 @private 인스턴스 변수에 액세스하는 방법은 무엇입니까?
- 30. 은 리눅스에서 사용 메모리를 처리합니다.
몇 가지 설명을 사용할 수 있습니다. 이 메모리를 동적으로 할당 했습니까? 아니면 당신을 위해 해준 도서관에 전화하십시오. 자동 또는 정적 변수와 관련된 메모리를 회수하려고합니까? – dmckee