본문 바로가기

C Language

메모리 할당 해제 문제 | Memory Allocating Freeing Problem

 

메모리 할당 해제 문제 ❘ Memory Allocating Freeing Problem

이 코드에서 free(new_node)를 하는 것은 실제로 문제가 될 수 있습니다. 이 부분을 자세히 살펴보겠습니다:

  1. new_node = get_new_node(ps_atoi(tmp[tmp_idx])): 새 노드를 생성합니다.
  2. overlap_checker(stacks, new_node->val): 새 노드의 값을 중복 체크하고 stacks->list에 추가합니다.
  3. free(new_node): 새로 생성한 노드를 해제합니다.

여기서 문제는 overlap_checker 함수가 new_node의 값을 stacks->list에 추가하지만, 실제 노드 구조체는 추가하지 않는다는 점입니다. 그 후에 new_node를 해제하면, 이 노드의 메모리가 완전히 해제됩니다.이 접근 방식에는 몇 가지 잠재적인 문제가 있습니다:

  1. 메모리 낭비: 노드를 생성했다가 바로 해제하는 것은 비효율적입니다.
  2. 데이터 구조의 불일치: stacks->list에는 값만 저장되고 실제 노드 구조체는 저장되지 않습니다.

이 문제를 해결하려면 다음과 같은 방법을 고려할 수 있습니다:

  1. new_node를 생성하지 않고 직접 값을 overlap_checker에 전달합니다:
c
int value = ps_atoi(tmp[tmp_idx]);
if (!ps_valid_atoi(tmp[tmp_idx]))
    ps_error();
overlap_checker(stacks, value);
  1. 또는 overlap_checker 함수를 수정하여 노드를 직접 추가하도록 합니다:
c
new_node = get_new_node(ps_atoi(tmp[tmp_idx]));
if (!ps_valid_atoi(tmp[tmp_idx]))
    ps_error();
add_node_to_stack(stacks, new_node); // 이 함수는 중복 체크와 노드 추가를 함께 수행

이렇게 하면 불필요한 메모리 할당과 해제를 피하고, 데이터 구조의 일관성을 유지할 수 있습니다.

 

The free(new_node) in this code could indeed be problematic. Let's examine this part in detail:

  1. new_node = get_new_node(ps_atoi(tmp[tmp_idx])): Creates a new node.
  2. overlap_checker(stacks, new_node->val): Checks for duplicates and adds the new node's value to stacks->list.
  3. free(new_node): Frees the newly created node.

The issue here is that the overlap_checker function adds the value of new_node to stacks->list, but not the actual node structure. Then, when new_node is freed, the memory for this node is completely released.This approach has several potential problems:

  1. Memory waste: Creating a node only to immediately free it is inefficient.
  2. Data structure inconsistency: stacks->list only stores values, not the actual node structures.

To resolve this issue, you could consider the following approaches:

  1. Don't create new_node, instead pass the value directly to overlap_checker:
c
int value = ps_atoi(tmp[tmp_idx]);
if (!ps_valid_atoi(tmp[tmp_idx]))
    ps_error();
overlap_checker(stacks, value);
  1. Or modify the overlap_checker function to directly add nodes:
c
new_node = get_new_node(ps_atoi(tmp[tmp_idx]));
if (!ps_valid_atoi(tmp[tmp_idx]))
    ps_error();
add_node_to_stack(stacks, new_node); // This function would perform both duplicate checking and node addition

These approaches would avoid unnecessary memory allocation and deallocation, and maintain consistency in the data structure.