free(): invalid size 에러

조회수 1577회
class BinaryTreeNode {
public:
    friend class BinaryTree;
    ~BinaryTreeNode() = default;

private:
    BinaryTreeNode(int data) : left(nullptr), right(nullptr), data(data) {}
    BinaryTreeNode* left;
    BinaryTreeNode* right;
    int data;
};

class BinaryTree {
public:
    ~BinaryTree() {
        postOrderTravRecur(this->root, BinaryTree::deleteAllData);
    }

    BinaryTreeNode createTreeNode(const int data) {
        auto* newNode = new BinaryTreeNode(data);
        return *newNode;
    }

    void makeSubTree(BinaryTreeNode& parent, BinaryTreeNode& child, const int option) {
        if (option == 1) {
            parent.left = &child;
        }
        ...
    }

    ...

    void BinaryTree::deleteAllData(const BinaryTreeNode* pNode) {
        delete pNode; // !!
    }

private:
    BinaryTreeNode* root;

간단한 이진 트리 클래스를 만들어 보았습니다. BinaryTreeNode 객체를 여러 개 만들고, 이를 makeSubTree() 메소드에 인자로 넘겨서 하나씩 트리로 추가하는 방식입니다.

트리의 생성까지는 문제가 없는데, 노드 삭제 시 문제가 발생하네요. 루트 노드부터 후위 순회 방식으로 노드를 하나씩 지우려는데, delete pNode문을 실행하면 free(): invalid size라는 에러 메시지가 뜹니다.

이 에러는 보통 동적 할당을 하지 않았는데 해제를 하려고 하면 발생하는 것으로 알고 있었는데요, 이 코드에서는 분명히 BinaryTreeNode 객체의 할당이 제대로 이루어졌는데 왜 이런 문제가 발생하는지 모르겠습니다.

전체 소스 코드: https://www.codepile.net/pile/k7D8yQ7P

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)