다른 기능에 할당되어 있는 빈 메모리가 있습니까?
C를 배우려고 하고 있으며, 현재 기본적인 스택 데이터 구조를 쓰려고 하는데, 기본을 얻을 수 없는 것 같습니다.malloc
/free
맞다.
사용하고 있는 코드는 다음과 같습니다(여기에서는, 특정의 문제를 나타내기 위해서 작은 부품을 투고하고 있습니다.전체 코드는 아니지만, 에러 메세지는 이 샘플 코드를 실행하는 것만으로 생성됩니다).valgrind
)
#include <stdio.h>
#include <stdlib.h>
typedef struct Entry {
struct Entry *previous;
int value;
} Entry;
void destroyEntry(Entry entry);
int main(int argc, char *argv[])
{
Entry* apple;
apple = malloc(sizeof(Entry));
destroyEntry(*(apple));
return 0;
}
void destroyEntry(Entry entry)
{
Entry *entry_ptr = &entry;
free(entry_ptr);
return;
}
내가 훑어볼 때론valgrind
와 함께--leak-check=full --track-origins=yes
, 다음의 에러가 표시됩니다.
==20674== Invalid free() / delete / delete[] / realloc()
==20674== at 0x4028E58: free (vg_replace_malloc.c:427)
==20674== by 0x80485B2: destroyEntry (testing.c:53)
==20674== by 0x8048477: main (testing.c:26)
==20674== Address 0xbecc0070 is on thread 1's stack
이 에러는 그 에러가destroyEntry
함수는 기본적으로 명시적으로 할당된 메모리를 수정할 수 없습니다.그래요?왜 난 그냥 못하지?free
내가 할당한 메모리main
다른 기능에서요?(그리고 이 행동은 어떤 식으로든 메인에 특유한 것입니까?)
다른 답변은 주요 문제를 지적하고 있습니다.destroyEntry in main()을 호출할 때 애플을 참조 해제하기 때문에 애플은 참조에 따라 통과하고 복사본을 만듭니다.
문제를 알게 되면 에러로 돌아가서, 다음에 문제가 발생했을 때, 보다 빨리 문제를 파악할 수 있도록, 그 에러의 텍스트를 문제에 접속하는 것이 도움이 됩니다.C와 C++ 오류는 때때로 화가 날 정도로 모호하게 보일 수 있습니다.
일반적으로 포인터의 해방이나 오브젝트의 삭제에 문제가 있을 때는, 주소를 인쇄하는 것을 좋아합니다.특히 할당할 때와 해방하려고 할 때 주소를 인쇄하는 것을 좋아합니다.볼라인드는 이미 잘못된 포인터의 주소를 알려줬지만, 좋은 포인터와 비교하는 것이 좋습니다.
int main()
{
Entry * apple;
apple = malloc(sizeof(Entry));
printf("apple's address = %p", apple); // Prints the address of 'apple'
free(apple); // You know this will work
}
그 후 printf() 스테이트먼트는 0x8024712(정확한 일반 범위 내의 주소를 구성했을 뿐)와 같은 주소를 제공하지만 Valgrind 출력은 0x4028E58을 제공한다는 것을 알 수 있습니다.서로 다른 두 장소(실제로는 0x4..)에 있다는 것을 알 수 있습니다.malloc()가 할당되는 힙이 아닌 스택 상에 있습니다.그러나 아직 시작 단계일 경우 이는 레드 플래그가 아닐 수 있습니다.따라서 잘못된 장소에서 메모리를 해방하려고 하는 것을 알 수 있습니다.따라서 "비활성 free()"입니다.
그래서 거기서부터 당신은 혼잣말을 할 수 있다. "좋아, 왠지 내 포인터가 망가지고 있어."당신은 이미 당신의 문제를 작고 이해하기 쉬운 예로 요약했기 때문에, 그 문제를 해결하는 데 오래 걸리지 않을 것입니다.
TL;DR - 포인터 관련 오류가 발생할 경우 주소를 인쇄하거나 즐겨찾는 디버거에서 찾아 보십시오.적어도 올바른 방향으로 인도해 주는 경우가 많습니다.
물론 이 모든 것이 스택 Exchange에 질문을 올리는 것을 막는 것은 아닙니다.수백 명의 프로그래머가 그렇게 함으로써 이익을 얻을 수 있을 것입니다.
매개변수를 함수에 전달할 때마다 복사본이 생성되고 해당 복사본에서 기능이 작동합니다. 당신의 은 래서 so so, so so so so so so so 를 하려고 하고 있다.free
원래 물건의 복사본인데 말이 안 돼요
그 에 포인터를 포인터로 할 수 .그리고 나서, 그것을 호출할 수 있습니다.free
그 포인터에 직접 표시해 주세요.
즉, 복사가서 로컬 변수인 "Memory"는 "Memory"입니다.여기서 로컬 변수는entry
주의:entry
는, 는, 이 의 때에 됩니다.destroyEntry
★★★★★★ 。
void destroyEntry(Entry entry)
{
Entry *entry_ptr = &entry;
free(entry_ptr);
return;
}
함수가 포인터를 가져가야 합니다(참조로 전달).
void destroyEntry(Entry *entry)
{
free(entry);
}
★★★★★★★★★★★★★★★★★ ★destroyEntry(*(apple));
전화하면 돼destroyEntry(apple);
되어 있는 다른 이 없는 해 주세요.destroyEntry
되어 있기 에 직접 free(apple)
언급URL : https://stackoverflow.com/questions/11071190/free-memory-allocated-in-a-different-function
'programing' 카테고리의 다른 글
Vue 구성 요소가 getter 데이터로 다시 로드되지 않음(반응 없음) (0) | 2022.08.10 |
---|---|
Vue 템플릿 요소의 일부를 코멘트 아웃합니다. (0) | 2022.08.10 |
'switch'가 'if'보다 빠릅니까? (0) | 2022.08.10 |
빈 루프가 C에서 비어 있지 않은 루프보다 느립니다. (0) | 2022.08.09 |
Java에서 파라미터 유형 옆에 있는 3개의 점은 무엇을 의미합니까? (0) | 2022.08.09 |