programing

다른 기능에 할당되어 있는 빈 메모리가 있습니까?

yoursource 2022. 8. 10. 22:39
반응형

다른 기능에 할당되어 있는 빈 메모리가 있습니까?

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

반응형